幹掉命令行窗口下MySql亂碼

  晚上重溫dos窗口操做mysql的時候,遇到了一個巨蛋疼的問題------>中文驗證碼  -->_-->,因此找了找資料弄懂了怎麼解決亂碼問題,,小記一下。mysql

新建一個表sql

create table student(
    id int,
    name varchar(20),
    chinese float,
    english float,
    math float
);

向表中插入數據(包含中文)數據庫

insert into student (id,name,chinese,english,math) values (1,'李狗蛋',88,93.5,78);

結果以下:服務器

報了一個Data too long for column 'name' at row 1的錯誤,,,爲何呢?個人那麼字段是20個字符的啊,,,李狗蛋三個字確定夠啊,,,爲何還提示太長了呢!!!!其實呢,,這種狀況下就算你只有一個漢字,也會報這個錯。。。。緣由何在?----->中文亂碼問題!!!編碼

跟servlet中亂碼產生的緣由同樣,仍是在與提交與接受兩者之間的編碼方式不同。。。。spa

咱們知道,在中文版win7下 dos命令行的默認編碼方式都是gbk的,而咱們裝的mysql服務器的默認編碼方式確實utf8,,這樣,,兩個編碼方式不同。。。經過dos窗口向mysql服務器提交中文數據,一個以gbk編碼提交,一個以utf8解碼接收,可不就產生了亂碼了嘛。命令行

不信咱們看看mysql的默認編碼----在dos窗口輸入code

show variables like 'character%';

 查看mysql服務器的編碼各類編碼狀態,以下:blog

但其實這些編碼格式只是mysql認爲的你的系統的編碼模式,但實際狀況並不是如此。表如今:客戶端編碼-->mysql認爲utf8,但其實你的dos命令行是在我天朝的win7下,那麼你就是gbk的編碼格式,而不是utf8;其餘的都是默認的utf8。到這裏就能夠看到,客戶端爲gbk,鏈接方式爲utf8,服務器存儲方式爲utf8,結果返回方式是utf8,那麼,,亂碼的出現緣由就呼之欲出了--->兩方編碼不同,以gbk敲代碼,結果以u8編碼,而後以utf8發送,以utf8接收。因此怎麼解決呢?servlet

  兩種辦法解決亂碼問題:臨時方法和完全方法。

臨時方法:在dos行下輸入「set names gkk;」而後再查看一下編碼方式,以下:

  明確告訴客戶端,個人dos行是以gbk敲進去的,你得用gbk給我編碼;告訴鏈接橋,我數據是gbk的,你得用gbk給我傳輸;告訴服務端,個人dos行是gbk的,你得用gbk把我存的數據返回給我。如今咱們再插入有以前有中文的那行數據,

能夠看到,亂碼問題已經不存在了。。。。可是呢,開頭都說了,這中方法是臨時型的,,爲什麼?來,打開另外一個dos窗口,查看下全部的編碼方式:

這個時候,你再插入帶有中文的數據,保證仍是剛纔的錯誤。。。爲啥呢?由於"set names gbk;"只針對當前客戶端(就是那個dos窗口)起做用。。打開另外一個窗口就不行了,因此這種方法治標不治本。若是每次都這樣,那不得累死了!!(不要跟我說你用可視化的mysql操做軟件,,咱們如今的語境是你根本不知道可視化,,,),那麼怎麼一勞永逸的解決這個問題呢?

完全解決:修改mysql配置文件--->my.ini

找到你的mysql安裝目錄下的my.ini文件,記事本打開,找到-----default-character-set=utf8 這句話,修改utf8爲gbk

而後重啓mysql,,好了,亂碼被幹掉了。Oh YEAH!!

 

多說一下,爲何改爲gbk以後就搞定了亂碼。。這中間涉及到了三個數據轉換過程:編碼,解碼,轉碼。

所謂編碼,就是將字符編成二進制數據的過程;

所謂解碼,就是將二進制數據解析爲字符的過程;

所謂轉碼,就是將一個字符從a字符集表示的二進制數據轉換成b字符集表示的二進制數據的過程。

在客戶端經過鏈接橋將gbk的數據發送給服務器的時候,兩方的編碼集實際上是不同的,數據庫接收到的是gbk,服務器要以utf8存儲,在這個過程當中,若是不作些什麼,亂碼是解決不掉的。。其實在這個過程當中,服務器本身作了一個轉碼的操做:將接收到的gbk數據轉換成utf8存儲到數據庫中,而後你查詢的時候它自動將utf8的數據轉換成gbk返回給你看。因此,亂碼沒了。

相關文章
相關標籤/搜索