正確設定MySQL中的字符集,解決終端亂碼問題

2021-05-24 22:09:27 字數 2010 閱讀 4612

正確設定mysql中的字符集,解決終端亂碼問題

我們經常在telnet終端操作mysql資料庫時會遇到中文亂碼問題,這主要是因為字符集設定錯誤造成的。這裡面涉及到好幾個地方的字符集設定,如果我們搞清楚它後面的原理,就可以很容易解決這些亂碼問題。

在mysql的客戶端上執行一次查詢的過程一般是,在客戶端的提示符後面輸入一條sql語句,回車,然後終端顯示出查詢的結果。這個過程中,只有終端和三個mysql的系統變數指定了正確的字符集,才能保證我們將乙個正確的sql語句送到伺服器,然後伺服器返回正確的結果,並且在終端正確顯示。

三個mysql的系統變數是:

1. character_set_client,終端字符集,告訴server客戶端提交的sql語句的編碼格式

2. character_set_connection,連線字符集,是伺服器翻譯sql語句時用到的編碼格式

3. character_set_results,返回的結果集的字符集,是伺服器返回結果集之前把結果集轉換成的編碼格式

在mysql終端通過執行命令 show variables like 『char%』 可以檢視這幾個變數的值。這三個變數通常都設定為同一種字符集,用命令set names [charset name]就可以修改這三個變數的值。一般來說,只要你設定了能夠表示你的資料的字符集,你查詢的結果都可以在終端正確顯示。比如你在資料庫中存入了中文資料,不管存入時使用的什麼字符集,你在終端即可以用set names命令設定為utf8,也可以設定為gbk編碼,只要你的終端顯示的字符集和你的設定一致就可以正確處理中文。

舉個例子,使用的表t1是utf8編碼,表中的字段c1繼承了這個編碼,表建立如下

mysql> create table t1 ( c1 text not null ) character set utf8;

用的字元是漢字「範」,gbk編碼為b7 b6,utf8編碼為e8 8c 83

用下面的sql語句插入資料

mysql> insert into t1 values( 『範』);

a)如果終端設定為utf8,並且執行了 set names utf8,那麼插入到資料庫中的就是「範」這個字的utf8編碼,這個過程中mysql不需要做編碼轉換。寫入資料庫的內容可以通過執行 select hex( c1 ) from t1 得到資料的十六進製制編碼來驗證。

b)如果終端設定為 utf8,並且執行了set names gbk,那麼執行完這個插入操作後,寫入的二進位制資料是e9 91 bc,這是「漢字「鑼」的utf8編碼。這是因為,終端輸入的「範」用的是utf8編碼,而伺服器以為終端傳送過來的內容是gbk編碼,所以在向t1表中插入的時候進行了一次gbk到utf8的轉換,結果當然是錯誤的。

c)如果終端設定為gbk,並且執行了set names gbk,那麼執行完插入操作後,寫入t1的依然是「範」這個字的utf8編碼。插入過程中,終端輸入的是「範」的gbk編碼b7 b6,伺服器被告知終端發過來的sql語句是gbk編碼(由character_set_client指定),所以在插入資料前做了一次gbk到utf8 的編碼轉換。

d)如果終端設定為gbk,並且執行了set names utf8,那麼執行完插入操作後,mysql會報出乙個資料被截斷的警告。實際上,輸入終端的是「範」這個字元的gbk編碼b7 b6,而伺服器被告知客戶端發過來的sql語句是utf8編碼,所以在執行過程中沒有做轉碼,直到插入資料的時候,發現b7 b6不符合utf8的編碼規則,給出了警告資訊,實際插入的資料是3f 3f,也就是兩個問號。

查詢的時候是同樣的道理,mysql也是根據set names設定的字符集來對返回給客戶端的結果集做相應的編碼轉換,如果轉換的結果和終端顯示的字符集一致,就能正確顯示,如果不一致就是亂碼。

結論是,只要終端的字符集和set names指定的字符集一致就可以讓mysql在處理過程中執行正確的轉碼並且正確地顯示。

另外,如果通過程式操作mysql資料庫, 那麼也需要事先執行set names命令來指定程式希望輸出的字符集。比如,用程式從乙個utf8編碼的資料庫向另外乙個gbk編碼的資料庫進行資料遷移,在選取源資料庫資料之前,需要執行set names gbk,才能取到gbk編碼的資料。

MySQL字符集設定不正確引起亂碼

mysql c builder qt 這麼個環境,一段中文資訊從qt生成,寫入乙個ini檔案,cb讀出這個ini裡的文字,生成sql語句寫入mysql。中間過程一切正常,最後的sql執行出錯,提示資訊裡說有無效字串,然後是一些亂碼。雖然可以把這個欄位用binary 方式寫入讓sql正常執行,但這個欄...

mysql字符集設定

show variables like char show variables like collation 2.修改編碼 set variable name value set character set connection utf8 3 顯示建立資料庫資訊 show create databa...

mysql 字符集設定

1.檢視mysql能夠支援的多種字符集 show character set 檢視mysql能夠支援的字符集的校對規則 show collation show collation like utf8 2.檢視當前字符集及校對 show variables like character set sho...