字符集問題之 MySQL, Linux終端, vim

一、MySQL 與 set names 有關的三個變量:

1. character_set_client:只是用來(向MySQL服務器)說明客戶端使用的sql語句採用的是什麼編碼,並不會進行轉換。

2. character_set_connection:見MySQL文檔。

3. character_set_result:見MySQL文檔。

值得注意的是另外兩個變量: 

character_set_server 與 character_set_database:他們是用來指示MySQL最終以什麼樣的編碼把數據存到磁盤上,這時會做必要的變換(這一點從實踐中得出,MySQL文檔中未提到)。其他信息見MySQL文檔。

 

二、character_set_client只起到標示的作用,而且標示得不一定對。那麼我客戶端的編碼究竟是什麼?

分三個情景:

1. 在終端中直接寫上SQL語句,如 insert into tb_temp(null, "情景一");  這裏語句的編碼是由locale決定的,通過LANG設置。locale 決定了鍵盤的輸入和終端的顯示(這裏的“顯示”,因理解爲終端的輸出緩存裏的字符的編碼)(在某終端裏設置,只對該終端有效)。比如,LANG=zh_CN.gbk,那麼語句是gbk編碼的;LANG=zh_CN.utf8,那麼語句是utf8編碼的。如果輸入到終端的是亂碼,那麼是 locale的設置 和 終端上的用來解析輸出緩存裏的字符的編碼不一致。

這裏順便提到VIM。有時在VIM中會遇到亂碼的情況。encoding變量默認情況下與locale的設置相同。說明文檔(:set encoding-names 查看)指出,如果這兩者不一致,vim會幫我們轉換。前提是你要裝好libiconv。不然除了不會給你自動轉換,而且一些字符集如gb2312它會提示沒有。在VIM命令模式下,使用set fenc? 來查看當前文件的編碼。用“set fenc=” 可將文件設置成另一種編碼,這也需要libiconv的支持。

我的.vimrc文件內容如下: 

*****************************

  set nu

  set tabstop=4

  set encoding=utf8

  set fileencoding=utf8

  set fileencodings=utf8,chinese,Latin1

*********************************

若不設置fileencodings(工作原理見說明文檔),vim中默認fileencodings=ucs-bom,utf-8,latin1。這樣的情況下,你的gbk文件在vim是亂碼的,因爲被當成Latin1編碼來顯示。fileencoding是用來指定你創建一個文件時所用的編碼。(顯然,若不設置fileencoding,那麼新建的文件會保存成encoding指定的格式)。fileencoding需要與fileencodings配合使用才行。

這樣設置好後,便能在LANG=zh_CN.utf8的情況下,編輯gbk以及其他格式的文件。
 
2.在console裏粘貼數據
這種情況下,粘貼進的數據是在終端解釋數據所用的字符集裏,跟locale無關。
 
3.使用腳本文件進行mysql的操作
比如 mysql > source /home/aa/test.sql
那麼所執行的sql語句的編碼與其所在的文件的編碼一致。
 
 
三、實踐指導意義:
1.
mysql數據庫的my.cnf 增加如下設置:
[mysqld]
default-character-set = utf8  #以便能存儲任何編碼的數據
2.
保證程序進行數據庫操作前都使用set name xx, 就不會出現亂碼。 若進數據庫發現有亂碼,試着改character_set_result;
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章