一般的解說是 utf8_general_ci 速度較快,utf8_unicode_ci 准確性較好 … 但快在那里,又好在什么地方呢?
首先就其准確性說,這世界上有無數種文字,除了通用的英文使用我們較熟悉的 A-Z 字符外,還有很多種近似的寫法用於法文、德文、俄文等等…
光是一個 A 字就有數十種不同表現
為什么不都用同一種 A 呢,幾十種多麻煩啊。事實上,它們在所屬的文字上都各有意義,可能代表不同的發音,也可能是其他東西。在某些語言上,同一個單詞不同發音可能就代表兩個意思。
校對規則
utf8_unicode_ci 及 utf8_general_ci 的用途就是對那些看起來不一樣的字符進行轉換,令我們進行排序比對時更方便准確。
以下面為例,直接看起來是不相等的,但在實際應用上是成立的,這就是 utf8_unicode_ci 及 utf8_general_ci 工作的結果。
Ä = A
Ö = O
Ü = U
而 utf8_unicode_ci 准確性較好就表現在它有更完整的字元對照表上,它甚至可以將一個特別字符轉換成多於一個英文字符,以德文中的 s 例:
在 utf8_unicode_ci 下面等式是成立
ß = ss
在 utf8_general_ci 只有這樣才成立
ß = s
排序規則
因為 utf8_unicode_ci 有更完整字符表及轉換規則,所以在排序的准確性上也比 utf8_general_ci 高一些。
utf8_general_ci 字符表的一部份
utf8_unicode_ci 有更完整的字符表
效能
同樣因為 utf8_unicode_ci 的字符表及轉換規則更復雜,所以在效能上比 utf8_general_ci 慢。
總結
如果你的應用是德文、俄文等等,或者需要精確處理國際化的內容,請用 utf8_unicode_ci 。
否則的話用 utf8_general_ci 就可以了。
備注
雖然說 utf8_unicode_ci 的字集比較完整,但其實還是不全的,所以 MySQL 還提供了很多種其他語言的專用字集,用於特別的本地應用,詳細可以看看下面的官網連結
參考
MySQL 官方解說: http://dev.mysql.com/doc/refman/5.0/en/charset-unicode-sets.html