Mysql中的排序規則utf8_unicode_ci、utf8_general_ci的區別總結
用了這麼長時間,發現自己竟然不知道utf_bin和utf_general_ci這兩者到底有什麼區別。。
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:字串每個字串用二進位制資料編譯儲存。 區分大小寫,而且可以存二進位制的內容
一、官方文件說明
下面摘錄一下Mysql 5.1中文手冊中關於utf8_unicode_ci與utf8_general_ci的說明:
當前,utf8_unicode_ci校對規則僅部分支援Unicode校對規則演算法。一些字元還是不能支援。並且,不能完全支援組合的記號。這主要影響越南和俄羅斯的一些少數民族語言,如:Udmurt 、Tatar、Bashkir和Mari。
utf8_unicode_ci的最主要的特色是支援擴充套件,即當把一個字母看作與其它字母組合相等時。例如,在德語和一些其它語言中‘ß'等於‘ss'。
utf8_general_ci是一個遺留的 校對規則,不支援擴充套件。它僅能夠在字元之間進行逐個比較。這意味著utf8_general_ci校對規則進行的比較速度很快,但是與使用utf8_unicode_ci的 校對規則相比,比較正確性較差)。
例如,使用utf8_general_ci和utf8_unicode_ci兩種 校對規則下面的比較相等:
Ä = A
Ö = O
Ü = U
兩種校對規則之間的區別是,對於utf8_general_ci下面的等式成立:
ß = s
但是,對於utf8_unicode_ci下面等式成立:
ß = ss
對於一種語言僅當使用utf8_unicode_ci排序做的不好時,才執行與具體語言相關的utf8字符集 校對規則。例如,對於德語和法語,utf8_unicode_ci工作的很好,因此不再需要為這兩種語言建立特殊的utf8校對規則。
utf8_general_ci也適用與德語和法語,除了‘ß'等於‘s',而不是‘ss'之外。如果你的應用能夠接受這些,那麼應該使用utf8_general_ci,因為它速度快。否則,使用utf8_unicode_ci,因為它比較準確。
如果你想使用gb2312編碼,那麼建議你使用latin1作為資料表的預設字符集,這樣就能直接用中文在命令列工具中插入資料,並且可以直接顯示出來.而不要使用gb2312或者gbk等字符集,如果擔心查詢排序等問題,可以使用binary屬性約束,例如:
二、簡短總結
utf8_unicode_ci和utf8_general_ci對中、英文來說沒有實質的差別。
utf8_general_ci校對速度快,但準確度稍差。
utf8_unicode_ci準確度高,但校對速度稍慢。
如果你的應用有德語、法語或者俄語,請一定使用utf8_unicode_ci。一般用utf8_general_ci就夠了,到現在也沒發現問題。。。
三、詳細總結
1、對於一種語言僅當使用utf8_unicode_ci排序做的不好時,才執行與具體語言相關的utf8字符集校對規則。例如,對於德語和法語,utf8_unicode_ci工作的很好,因此不再需要為這兩種語言建立特殊的utf8校對規則。
2、utf8_general_ci也適用與德語和法語,除了‘?'等於‘s',而不是‘ss'之外。如果你的應用能夠接受這些,那麼應該使用 utf8_general_ci,因為它速度快。否則,使用utf8_unicode_ci,因為它比較準確。
用一句話概況上面這段話:utf8_unicode_ci比較準確,utf8_general_ci速度比較快。通常情況下 utf8_general_ci的準確性就夠我們用的了,在我看過很多程式原始碼後,發現它們大多數也用的是utf8_general_ci,所以新建資料 庫時一般選用utf8_general_ci就可以了
四、如何在MySQL5.0中使用UTF8
在 my.cnf中增加下列引數
[mysqld]
init_connect='SET NAMES utf8′
default-character-set=utf8
default-collation = utf8_general_ci
執行查詢 mysql> show variables; 相關如下:
character_set_connection | utf8
character_set_database | utf8
character_set_results | utf8
character_set_server | utf8
character_set_system | utf8
collation_connection | utf8_general_ci
collation_database | utf8_general_ci
collation_server | utf8_general_ci
個人見解,對於資料庫的使用,utf8 - general 已經足夠的準確,並且相較與 utf8 - unicode速度上有優勢,固可放心採用之
附1:舊資料升級辦法
以原來的字符集為latin1為例,升級成為utf8的字符集。原來的表: old_table (default charset=latin1),新表:new_table(default charset=utf8)。
第一步:匯出舊資料
第二步:轉換編碼(類似unix/linux環境下)
或者可以去掉 -f 引數,讓iconv自動判斷原來的字符集
在這裡,假定原來的資料預設是gb2312編碼。
第三步:匯入
修改old.sql,在插入/更新語句開始之前,增加一條sql語句: "SET NAMES utf8;",儲存。
大功告成!!
附2:支援檢視utf8字符集的MySQL客戶端有
1.) MySQL-Front,據說這個專案已經被MySQL AB勒令停止了,不知為何,如果國內還有不少破解版可以下載(不代表我推薦使用破解版 :-P)。
2.) Navicat,另一款非常不錯的MySQL客戶端,漢化版剛出來,還邀請我試用過,總的來說還是不錯的,不過也需要付費。
3.) PhpMyAdmin,開源的php專案,非常好。
4.) Linux下的終端工具(Linux terminal),把終端的字符集設定為utf8,連線到MySQL之後,執行 SET NAMES UTF8; 也能讀寫utf8資料了。
相關文章
- MySQL中的排序規則MySql排序
- 【MySQL】批次修改排序規則MySql排序
- SERVER的排序規則Server排序
- js中==和===的區別以及總結JS
- Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICUnicode
- JS中this的繫結規則JS
- JavaScript中this的繫結規則JavaScript
- Mysql學習總結(50)——Oracle,mysql和SQL Server的區別MySqlOracleServer
- MySql Order By 多個欄位 排序規則MySql排序
- C# 中 Struct 和 Class 的區別總結C#Struct
- mysql中!=和is not的區別MySql
- mysql中“ ‘ “和 “ ` “的區別MySql
- PHP 中的氣泡排序總結PHP排序
- post、get的區別總結
- JS中this的4種繫結規則JS
- 關於MySQL與SQLLite的GroupBy排序原理的區別MySql排序
- css書寫規則總結CSS
- 函式呼叫規則總結函式
- 面試中的排序演算法總結面試排序演算法
- get與post的區別總結
- oracle中service_name區別總結Oracle
- MySQL中的排序MySql排序
- Java中靜態跟非靜態的區別總結Java
- SQL Server排序規則SQLServer排序
- Activity的啟動模式及IntentFilter匹配規則總結模式IntentFilter
- 總結MySQL儲存引擎MyISAM與InnoDB區別MySql儲存引擎
- MySQL 中的鎖有哪些型別,MySQL 中加鎖的原則MySql型別
- Mysql 中 MyISAM 和 InnoDB 的區別MySql
- MySQL語法中=與:=的區別MySql
- mysql 中set和enum的區別MySql
- MySQL操作規範(總結)MySql
- Mysql-基本的規則與規範MySql
- cookie和session的區別(全面總結)CookieSession
- 設計模式中的幾大原則總結設計模式
- Mysql支援的資料型別(總結)MySql資料型別
- 關於mysql字符集及排序規則設定MySql排序
- JavaScript識別符號命名規則總結和保留字歸納JavaScript符號
- [MySQL] MySQL資料庫中唯一識別符號(ID)的梳理總結MySql資料庫符號