【MySQL】關於字符集和其排序問題

最近看到一個比較細微容易忽略的問題,做個備忘

字符集

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

導入完成

發佈了33 篇原創文章 · 獲贊 45 · 訪問量 20萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章