Toad fro MySQL 6.0 的客戶端中文字元編碼問題

atlantisholic發表於2012-03-29
對於Mysql安裝的時候如果沒有設定utf8編碼,而是使用了預設的latin1,則預設情況下,建立的資料庫和表也預設latin1,建立表的時候顯式指定utf-8也可以,也能儲存中文字元。不過,如果在一個latin1的database下面訪問一個utf-8的database裡面的表裡面的中文,同樣可能出現亂碼。

Toad fro MySQL 4.6 Freeware中連線設定視窗中能夠設定是否使用Unicode,所以能夠靈活地根據伺服器上字符集的設定調整本地字符集設定,從而免除中文亂碼的煩惱。

不過,最近Toad fro MySQL 5.0 Freeware版本(5.0.0.345)釋出後,聲稱其內建Unicode支援,但是在連線我的一個測試環境的時候,查詢獲得的中文都沒有問題,但是修改資料庫的操作中涉及的中文都導致了亂碼。一下是一種解決方法。

1)背景知識——MySQL的字符集設定,以下摘自網上。

mysql4.1及其之後的版本,對字符集的支援分為四個層次: 伺服器(server),資料庫(database),資料表(table)和連線(connection):
character_set_server:這是設定伺服器使用的字符集
character_set_client :這是設定客戶端傳送查詢使用的字符集
character_set_connection :這是設定伺服器需要將收到的查詢串轉換成的字符集
character_set_results :這是設定伺服器要將結果資料轉換到的字符集,轉換後才傳送給客戶端
整個過程:
- client(如php程式)傳送一個查詢;
- 伺服器收到查詢,將查詢串從character_set_client 轉換到character_set_connection,然後執行轉換後的查詢;
- 伺服器將結果資料轉換到character_set_results字符集後傳送回客戶端。

你可以用下邊兩條命令檢視一下系統的字符集和排序方式設定:

mysql> SHOW VARIABLES LIKE ‘character_set_%’;

mysql> SHOW VARIABLES LIKE ‘collation_%’;

+--------------------------+---------------------------------+
| Variable_name            | Value                           |
+--------------------------+---------------------------------+
| character_set_client     | latin1                          |
| character_set_connection | latin1                          |
| character_set_database   | latin1                          |
| character_set_filesystem | binary                          |
| character_set_results    | latin1                          |
| character_set_server     | latin1                          |
| character_set_system     | utf8                            |
| character_sets_dir       | D:""share"charsets" |
+--------------------------+---------------------------------+

mysql 預設用的字符集是latin1,連線校對用的latin1-_swedish_ci。看到這兒你應試有點明白了,我們通過php傳送的查詢一般是utf8或者GBK,GB2312,而它預設的是latin1,所以用phpmyadmin檢視或者直接進資料庫裡檢視資料,都是一些亂碼。(存取出來放在網頁上大多是正常的。)phpmyadmin在對mysql4.0以下會使用內建的庫來實現字符集的轉換,從而支援多語言版本,而對於4.1以上則完全交給Mysql。所以以上幾個層次的轉換如果有字符集不匹配的情況,出現亂碼就很容易理解了。說了半天,其實你只要把上述變數設定一致了,不管是直接在資料庫裡檢視,還是在phpmyadmin裡檢視都不會出現中文亂碼了。

假如你的系統和php網頁是utf8編碼,你可以將mysql的編碼由預設的latin1改為utf8.

編輯mysql的配置檔案,/etc/,在[mysqld]中設定default-character-set=utf8即可。不過原來的資料,假如你用4.0,mysqldump出來的資料是latin1的編碼,你再匯入就會出現亂碼。如果你原來的資料非常寶貴,那你還是用latin1編碼吧。

2)有了以上的背景知識,發現問題原因出在中文環境下Toad fro MySQL 5.0 Freeware連線伺服器後,variables中顯示的本地字符集為latin1,而Toad fro MySQL 4.6 Freeware勾選Unicode支援時variables中顯示的是utf8。然後再看MySQL伺服器上,儘管database的字符集設定的是utf8,但是character_set_system變數顯示的是latin1,所以問題的原因應該是:Toad fro MySQL 5.0 Freeware連線MySQL時,會根據伺服器上character_set_system或者character-set-server的設定設定本地的字符集。所以,在mysql啟動的命令列中新增--default_character_set=utf8(5.1中已經不建議使用,已--character-set-server替代),重新用Toad fro MySQL 5.0 Freeware連線,問題解決。(對於linux環境下,可以在/etc/my.cnf檔案中新增character-set-server=utf8)。

追加:對於mysql自帶的命令列工具mysl.exe,它會讀取my.ini檔案中的[mysql]段下的defautl-character-set設定,所以對於中文客戶端可以設定為gbk。此外,可以使用set charset gbk設定當前連線客戶端使用的字符集,Toad fro MySQL 5.0 Freeware預設情況下會使用相同的連線,在設計中文字元問題的操作前使用此語句(只需要執行一次),也能湊效。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23071790/viewspace-719848/,如需轉載,請註明出處,否則將追究法律責任。

相關文章