首頁(yè)技術(shù)文章正文

JavaEE技術(shù)點(diǎn):MySQL編碼問(wèn)題

更新時(shí)間:2017-12-26 來(lái)源:黑馬程序員 瀏覽量:

我們?cè)赿os窗口下使用命令操作數(shù)據(jù)庫(kù)時(shí),當(dāng)向數(shù)據(jù)庫(kù)中插入的數(shù)據(jù)或從數(shù)據(jù)庫(kù)中查詢的數(shù)據(jù)中包含中文時(shí),就會(huì)出現(xiàn)亂碼。出現(xiàn)亂碼的原因是我們安裝MySQL數(shù)據(jù)庫(kù)服務(wù)器時(shí)已經(jīng)指定了編碼是utf8,而dos窗口的默認(rèn)編碼是gbk,也就是說(shuō)客戶端與服務(wù)器的編碼不一樣,這樣就導(dǎo)致了亂碼。

使用如下命令可以查看MySQL數(shù)據(jù)庫(kù)編碼:

l SHOW VARIABLES LIKE 'char%'

使用以上命令查看數(shù)據(jù)庫(kù)編碼,如圖1-1所示:

MySQL編碼

圖1-1 查看數(shù)據(jù)庫(kù)編碼

如圖1-1所示,數(shù)據(jù)庫(kù)的編碼是utf8,下面我們來(lái)介紹其中兩項(xiàng)編碼:

l character_set_client=utf8:客戶端通知數(shù)據(jù)庫(kù)服務(wù)器它的編碼方式:

? 客戶端即dos窗口發(fā)送的數(shù)據(jù)是gbk編碼;

? MySQL使用character_set_client指定的編碼來(lái)解讀客戶端發(fā)送過(guò)來(lái)的數(shù)據(jù),例如編碼為UTF8;

? 結(jié)果:客戶端發(fā)送過(guò)來(lái)的數(shù)據(jù)不是UTF8編碼,那么就會(huì)出現(xiàn)亂碼;

l character_set_results=utf8:數(shù)據(jù)庫(kù)服務(wù)器向客戶端發(fā)送的數(shù)據(jù)使用utf8編碼:

? MySQL會(huì)以character_set_results指定的編碼方式將待發(fā)送的數(shù)據(jù)編碼,然后發(fā)送給客戶端,例如編碼為UTF8;

? 客戶端不使用UTF8來(lái)解讀,而是使用gbk編碼來(lái)解讀;

? 結(jié)果:客戶端不是使用UTF8來(lái)解讀,那么就會(huì)出現(xiàn)亂碼。

下面我們來(lái)試驗(yàn)一下,首先向數(shù)據(jù)庫(kù)服務(wù)器端發(fā)送數(shù)據(jù),如圖1-2所示:

MySQL編碼

圖1-2 插入數(shù)據(jù)亂碼

圖1-2中,在dos窗口下向數(shù)據(jù)庫(kù)服務(wù)器發(fā)送數(shù)據(jù),數(shù)據(jù)中包含中文“張三”,“張三”在dos窗口下是gbk編碼,但是數(shù)據(jù)庫(kù)服務(wù)器使用utf8進(jìn)行解碼,就出現(xiàn)亂碼,因此插入失敗。

解決辦法:

l 讓客戶端發(fā)送utf8的數(shù)據(jù):在dos窗口下,它的編碼就是gbk,很難修改,因此該方法是行不通的;

l 將character_set_client的值修改為gbk:通過(guò)命令:set character_set_client=gbk通知數(shù)據(jù)庫(kù)服務(wù)器客戶端的編碼是gbk,但是該方法有一個(gè)局限性,它只在當(dāng)前dos窗口中有效,只要退出訪問(wèn)mysql,那么再次登錄時(shí)這個(gè)值需要重新設(shè)置。

下面,我們使用第二種解決辦法來(lái)解決亂碼,如圖1-3所示:

MySQL編碼

圖1-3 解決插入數(shù)據(jù)中文亂碼問(wèn)題

圖1-3中向student表中插入一條數(shù)據(jù),下面我們來(lái)查詢?cè)摫淼挠涗洠鐖D1-4所示:

MySQL編碼

圖1-4 查詢student表

圖1-4中,查詢的數(shù)據(jù)出現(xiàn)亂碼。

解決辦法:

l 讓服務(wù)器發(fā)送gbk編碼的數(shù)據(jù):使用命令:set character_set_results=gbk將服務(wù)器發(fā)送數(shù)據(jù)的編碼設(shè)置為gbk,該方法有一個(gè)局限性,它也只對(duì)當(dāng)前的dos窗口有效,關(guān)閉窗口或退出就需要重新設(shè)置;

l 讓dos窗口使用utf8編碼來(lái)解讀數(shù)據(jù):dos窗口的編碼是gbk,很難改變,因此該方法是行不通的。

下面,我們使用以上方法中的第二種方法來(lái)解決查詢數(shù)據(jù)亂碼問(wèn)題,如圖1-5所示:

MySQL編碼

圖1-5 查詢student表

以上解決插入數(shù)據(jù)中文亂碼,和查詢數(shù)據(jù)中文亂碼的方法都只對(duì)當(dāng)前dos窗口有效,當(dāng)關(guān)閉窗口或退出,再次登錄時(shí)又需要重新設(shè)置。這種方法不是長(zhǎng)久之計(jì),下面給大家介紹一個(gè)一勞永逸的方法,如下:

在MySQL的安裝目錄下有一個(gè)my.ini文件,如圖1-6所示:

MySQL編碼

圖1-6 my.ini文件

打開(kāi)圖1-6所示中的my.ini文件,找到如圖1-7所示的代碼:

MySQL編碼

圖1-7 my.ini文件內(nèi)容

將圖1-7中,用紅線標(biāo)注的:default-character_set=utf8修改為default-character-set=gbk,如圖1-8所示:

MySQL編碼

圖1-8 修改client編碼

圖1-8中,修改了default-character-set的編碼為gbk,有以下作用:

l 將character_set_client的值修改為gbk:解決插入數(shù)據(jù)中文亂碼問(wèn)題;

l 將character_set_results的值修改為gbk:解決查詢數(shù)據(jù)中文亂碼問(wèn)題;

l 將character_set_connection的值修改為gbk。

修改了my.ini文件之后需要重啟MySQL服務(wù),然后再次查詢數(shù)據(jù)庫(kù)編碼如圖1-9所示:

MySQL編碼

圖1-8 重新啟動(dòng)MySQL服務(wù)

現(xiàn)在我們?cè)俅尾榭磗tudent表,看張三是否還是亂碼,如圖1-9所示:

MySQL編碼

圖1-9 查看是否亂碼

以上都是解決在dos窗口下操作數(shù)據(jù)庫(kù)時(shí)的亂碼問(wèn)題,我們安裝了SQLyog工具之后,在該工具中使用sql語(yǔ)句操作數(shù)據(jù)庫(kù)時(shí),它的編碼就是utf8,因此不會(huì)出現(xiàn)亂碼問(wèn)題,我們以后操作數(shù)據(jù)庫(kù)也不再使用dos窗口,而是使用SQLyog工具。


本文版權(quán)歸黑馬程序員JavaEE學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!

作者:黑馬程序員JavaEE培訓(xùn)學(xué)院

首發(fā):http://java.itheima.com/

分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!