干掉命令行窗口下MySql亂碼
晚上重溫dos窗口操作mysql的時(shí)候,遇到了一個(gè)巨蛋疼的問題------>中文驗(yàn)證碼 -->_-->,所以找了找資料弄懂了怎么解決亂碼問題,,小記一下。
新建一個(gè)表
create table student( id int, name varchar(20), chinese float, english float, math float );
向表中插入數(shù)據(jù)(包含中文)
insert into student (id,name,chinese,english,math) values (1,'李狗蛋',88,93.5,78);
結(jié)果如下:
報(bào)了一個(gè)Data too long for column 'name' at row 1的錯(cuò)誤,,,為什么呢?我的那么字段是20個(gè)字符的啊,,,李狗蛋三個(gè)字肯定夠啊,,,為什么還提示太長了呢!?。?!其實(shí)呢,,這種情況下就算你只有一個(gè)漢字,也會報(bào)這個(gè)錯(cuò)。。。。原因何在?----->中文亂碼問題?。。?/span>
跟servlet中亂碼產(chǎn)生的原因一樣,還是在與提交與接受二者之間的編碼方式不一樣。。。。
我們知道,在中文版win7下 dos命令行的默認(rèn)編碼方式都是gbk的,而我們裝的mysql服務(wù)器的默認(rèn)編碼方式確實(shí)utf8,,這樣,,兩個(gè)編碼方式不一樣。。。通過dos窗口向mysql服務(wù)器提交中文數(shù)據(jù),一個(gè)以gbk編碼提交,一個(gè)以utf8解碼接收,可不就產(chǎn)生了亂碼了嘛。
不信我們看看mysql的默認(rèn)編碼----在dos窗口輸入
show variables like 'character%';
查看mysql服務(wù)器的編碼各種編碼狀態(tài),如下:

但其實(shí)這些編碼格式只是mysql認(rèn)為的你的系統(tǒng)的編碼模式,但實(shí)際情況并非如此。表現(xiàn)在:客戶端編碼-->mysql認(rèn)為utf8,但其實(shí)你的dos命令行是在我天朝的win7下,那么你就是gbk的編碼格式,而不是utf8;其他的都是默認(rèn)的utf8。到這里就可以看到,客戶端為gbk,連接方式為utf8,服務(wù)器存儲方式為utf8,結(jié)果返回方式是utf8,那么,,亂碼的出現(xiàn)原因就呼之欲出了--->兩方編碼不一樣,以gbk敲代碼,結(jié)果以u8編碼,然后以utf8發(fā)送,以utf8接收。所以怎么解決呢?
兩種辦法解決亂碼問題:臨時(shí)方法和徹底方法。
臨時(shí)方法:在dos行下輸入“set names gkk;”然后再查看一下編碼方式,如下:

明確告訴客戶端,我的dos行是以gbk敲進(jìn)去的,你得用gbk給我編碼;告訴連接橋,我數(shù)據(jù)是gbk的,你得用gbk給我傳輸;告訴服務(wù)端,我的dos行是gbk的,你得用gbk把我存的數(shù)據(jù)返回給我。現(xiàn)在我們再插入有之前有中文的那行數(shù)據(jù),

可以看到,亂碼問題已經(jīng)不存在了。。。。但是呢,開頭都說了,這中方法是臨時(shí)型的,,為何?來,打開另一個(gè)dos窗口,查看下所有的編碼方式:

這個(gè)時(shí)候,你再插入帶有中文的數(shù)據(jù),保證還是剛才的錯(cuò)誤。。。為啥呢?因?yàn)?set names gbk;"只針對當(dāng)前客戶端(就是那個(gè)dos窗口)起作用。。打開另一個(gè)窗口就不行了,所以這種方法治標(biāo)不治本。如果每次都這樣,那不得累死了!!(不要跟我說你用可視化的mysql操作軟件,,我們現(xiàn)在的語境是你根本不知道可視化,,,),那么怎么一勞永逸的解決這個(gè)問題呢?
徹底解決:修改mysql配置文件--->my.ini
找到你的mysql安裝目錄下的my.ini文件,記事本打開,找到-----default-character-set=utf8 這句話,修改utf8為gbk

然后重啟mysql,,好了,亂碼被干掉了。Oh YEAH!!
多說一下,為什么改成gbk之后就搞定了亂碼。。這中間涉及到了三個(gè)數(shù)據(jù)轉(zhuǎn)換過程:編碼,解碼,轉(zhuǎn)碼。
所謂編碼,就是將字符編成二進(jìn)制數(shù)據(jù)的過程;
所謂解碼,就是將二進(jìn)制數(shù)據(jù)解析為字符的過程;
所謂轉(zhuǎn)碼,就是將一個(gè)字符從a字符集表示的二進(jìn)制數(shù)據(jù)轉(zhuǎn)換成b字符集表示的二進(jìn)制數(shù)據(jù)的過程。
在客戶端通過連接橋?qū)bk的數(shù)據(jù)發(fā)送給服務(wù)器的時(shí)候,兩方的編碼集其實(shí)是不一樣的,數(shù)據(jù)庫接收到的是gbk,服務(wù)器要以utf8存儲,在這個(gè)過程中,如果不做些什么,亂碼是解決不掉的。。其實(shí)在這個(gè)過程中,服務(wù)器自己做了一個(gè)轉(zhuǎn)碼的操作:將接收到的gbk數(shù)據(jù)轉(zhuǎn)換成utf8存儲到數(shù)據(jù)庫中,然后你查詢的時(shí)候它自動將utf8的數(shù)據(jù)轉(zhuǎn)換成gbk返回給你看。所以,亂碼沒了。
浙公網(wǎng)安備 33010602011771號