教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

Java培訓之MySQL編碼問題(一)

更新時間:2016年06月24日15時23分 來源:傳智播客java培訓學院 瀏覽次數(shù):

我們在dos窗口下使用命令操作數(shù)據(jù)庫時,當向數(shù)據(jù)庫中插入的數(shù)據(jù)或從數(shù)據(jù)庫中查詢的數(shù)據(jù)中包含中文時,就會出現(xiàn)亂碼。出現(xiàn)亂碼的原因是我們安裝MySQL數(shù)據(jù)庫服務器時已經(jīng)指定了編碼是utf8,而dos窗口的默認編碼是gbk,也就是說客戶端與服務器的編碼不一樣,這樣就導致了亂碼。
使用如下命令可以查看MySQL數(shù)據(jù)庫編碼:
  • SHOW VARIABLES LIKE 'char%'
使用以上命令查看數(shù)據(jù)庫編碼,如圖1-1所示:

圖1-1 查看數(shù)據(jù)庫編碼
如圖1-1所示,數(shù)據(jù)庫的編碼是utf8,下面我們來介紹其中兩項編碼:
  • character_set_client=utf8:客戶端通知數(shù)據(jù)庫服務器它的編碼方式:
  • 客戶端即dos窗口發(fā)送的數(shù)據(jù)是gbk編碼;
  • MySQL使用character_set_client指定的編碼來解讀客戶端發(fā)送過來的數(shù)據(jù),例如編碼為UTF8;
  • 結(jié)果:客戶端發(fā)送過來的數(shù)據(jù)不是UTF8編碼,那么就會出現(xiàn)亂碼;
  • character_set_results=utf8:數(shù)據(jù)庫服務器向客戶端發(fā)送的數(shù)據(jù)使用utf8編碼:
  • MySQL會以character_set_results指定的編碼方式將待發(fā)送的數(shù)據(jù)編碼,然后發(fā)送給客戶端,例如編碼為UTF8;
  • 客戶端不使用UTF8來解讀,而是使用gbk編碼來解讀;
  • 結(jié)果:客戶端不是使用UTF8來解讀,那么就會出現(xiàn)亂碼。
下面我們來試驗一下,首先向數(shù)據(jù)庫服務器端發(fā)送數(shù)據(jù),如圖1-2所示:

圖1-2 插入數(shù)據(jù)亂碼
圖1-2中,在dos窗口下向數(shù)據(jù)庫服務器發(fā)送數(shù)據(jù),數(shù)據(jù)中包含中文“張三”,“張三”在dos窗口下是gbk編碼,但是數(shù)據(jù)庫服務器使用utf8進行解碼,就出現(xiàn)亂碼,因此插入失敗。
解決辦法:
  • 讓客戶端發(fā)送utf8的數(shù)據(jù):在dos窗口下,它的編碼就是gbk,很難修改,因此該方法是行不通的;
  • 將character_set_client的值修改為gbk:通過命令:set character_set_client=gbk通知數(shù)據(jù)庫服務器客戶端的編碼是gbk,但是該方法有一個局限性,它只在當前dos窗口中有效,只要退出訪問mysql,那么再次登錄時這個值需要重新設置。
下面,我們使用第二種解決辦法來解決亂碼,如圖1-3所示:

圖1-3 解決插入數(shù)據(jù)中文亂碼問題
圖1-3中向student表中插入一條數(shù)據(jù),下面我們來查詢該表的記錄,如圖1-4所示:

圖1-4 查詢student表
圖1-4中,查詢的數(shù)據(jù)出現(xiàn)亂碼。
解決辦法:
  • 讓服務器發(fā)送gbk編碼的數(shù)據(jù):使用命令:set character_set_results=gbk將服務器發(fā)送數(shù)據(jù)的編碼設置為gbk,該方法有一個局限性,它也只對當前的dos窗口有效,關(guān)閉窗口或退出就需要重新設置;
  • 讓dos窗口使用utf8編碼來解讀數(shù)據(jù):dos窗口的編碼是gbk,很難改變,因此該方法是行不通的。
下面,我們使用以上方法中的第二種方法來解決查詢數(shù)據(jù)亂碼問題,如圖1-5所示:

圖1-5 查詢student表

本文版權(quán)歸傳智播客Java培訓學院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!
作者:傳智播客Java培訓學院
首發(fā):http://xamj520.com/javaee
0 分享到:
和我們在線交談!