分類: Mysql/postgreSQL
論壇中有不少帖子是關於字符集與中文的問題,仔細看了下,講解的都不甚詳細,本人學習MySQL亦僅數日,在此將本人看書心得略表一二,望起拋磚引玉之效。
================================
關於中文問題實際上並沒有什麼複雜的,請注意如下2個細節:
1)只要是gb2312,gbk,utf8等支持多字節編碼的字符集都可以儲存漢字,當然,gb2312中的漢字數量遠少於gbk,而gb2312,gbk等都可在utf8下編碼。因此,要想數據表中能儲存中文只需數據表的字符集按需任選一種可存儲漢字的既可。
在建立數據表時,若數據庫的字符集不支持中文集則在create table 後面加上 character set gb2312/gbk/utf8 任選其一既可,否則新建的表會自動採用與數據庫相同的字符集的。
MySQL還有一個很棒的地方,可以爲列指定字符集,hoho~~我喜歡
總之,用show create table table_name; 查看確保你的數據表的字符集支持中文存儲既可
2)至於前臺顯示、輸入中文的問題,由於本人不會php等(所以也不用客戶端軟件),因此僅就cmd下的client爲例作說明,想來在其他客戶端也應是如此配置吧,有不對的地方望指教,有遺漏的望大家補充。
很多帖子中說,需要client的字符集與服務器端字符集、數據庫字符集等一致,其實無須這麼複雜。
在任何的字符集狀態下,我們都可以對可存儲中文的數據表插入中文,只需要在所要插入的中文前添加一個introducer表明我要對此中文的編碼方式既可,請看:
insert into table_name (column_with_chinese) values( _gbk '我要插入的中文');
這個命令中的_gbk即是一個"character set introducer",它表明後面的 '我要插入的中文'將採用gbk編碼。請大家注意introducer和函數convert()的區別,這個,留給大家自己查閱資料。
這樣,無論在任何字符集下,都可以保證正確無誤的插入中文,或者是其他任何字符集的文字。
說到這裏,可能大家覺得太煩了,每次都要加一個introducer,那麼我們再來看看mysql的設置,看看怎麼簡化它。
用命令show variables like 'character\_set\_%';查看當前字符集設定:
+--------------------------+--------+
| Variable_name | Value |
+--------------------------+--------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | utf8 |
| character_set_system | utf8 |
+--------------------------+--------+
(我這裏爲了演示故意設置成latin1這種不支持多字節的字符集)
很多人會遇到的錯誤:Data too long for column 'XXX' at row 1,其產生的原因在於character_set_connection的字符集設置,如果我們用了introducer,那麼該參數無視;若將此參數改爲與數據表中文編碼方式相同,如gbk,則我們可省略掉introducer的書寫,傳遞到服務端的字符串將自動以該字符集進行編碼。
此時,我們用select命令來查看數據表數據,卻發現會出現亂碼現象,因此,請大家注意character_set_results這個參數,他表示的是服務器段返回給客戶端的結果集所採用的字符集,因此,僅需將此設置成gbk:set character_set_results = gbk; 那麼我們就可以正常的查看數據表內的中文內容了。
由此可見出現中文問題最關鍵的兩個參數就是以上這兩個,有些則其他參數的含義留給各位自行查閱資料。
若大家覺得單獨設置字符集太繁瑣,那麼最簡單的工作就是用set names charset_name;一次性設置客戶端的所有字符集,這下可就可以偷懶了。