最近看到一個比較細微容易忽略的問題,做個備忘
字符集
MySQL支持多種字符集,若需支持中文,首選的推薦utf8。服務在默認安裝時是latin1,西歐標準。需要手動修改爲utf8。
以下爲指令
//顯示當前數據庫支持的所有字符集
mysql> show charset;
//顯示當前數據庫配置
mysql> show variables;
排序
排序,其實是字符集後面的collections
ci是 case insensitive, 即 “大小寫不敏感”, a 和 A 會在字符判斷中會被當做一樣的;
bin 是二進制, a 和 A 會別區別對待.
例如運行:
SELECT * FROM table WHERE txt = ‘a’
那麼在utf8_bin中你就找不到 txt = ‘A’ 的那一行, 而 utf8_general_ci 則可以.
utf8_general_ci 不區分大小寫,這個你在註冊用戶名和郵箱的時候就要使用。
utf8_general_cs 區分大小寫,如果用戶名和郵箱用這個 就會照成不良後果
utf8_bin:字符串每個字符串用二進制數據編譯存儲。 區分大小寫,而且可以存二進制的內容
unicode和general
utf8_unicode_ci和utf8_general_ci對中、英文來說沒有實質的差別。
utf8_general_ci校對速度快,但準確度稍差。
utf8_unicode_ci準確度高,但校對速度稍慢。
舊字符集升級新字符集
以舊的字符集爲latin1爲例,升級成爲utf8的字符集。
原來的表: old_table (default charset=latin1)
新表:new_table(default charset=utf8)
第一步:導出舊數據
複製代碼 代碼如下:
mysqldump --default-character-set=latin1 -h localhost -u root -B my_db --tables old_table > old.sql
第二步:轉換編碼(類似unix/linux環境下)
複製代碼 代碼如下:
iconv -t utf-8 -f gb2312 -c old.sql > new.sql
或者可以去掉 -f 參數,讓iconv自動判斷原來的字符集
複製代碼 代碼如下:
iconv -t utf-8 -c old.sql > new.sql
在這裏,假定原來的數據默認是gb2312編碼。
第三步:導入
修改old.sql,在插入/更新語句開始之前,增加一條sql語句:
"SET NAMES utf8;"
保存。
複製代碼 代碼如下:
mysql -h localhost -u root my_db < new.sql
導入完成