utf8_general_ci
は非常に単純であり、Unicodeでは非常に壊れた照合であり、誤った結果をもたらします。 一般的なUnicodeテキスト。内容:
- 正規分解のためにUnicode正規化形式Dに変換します
- 結合文字を削除します
- 大文字に変換します
これはUnicodeの大文字小文字を理解しないため、Unicodeでは正しく機能しません。 Unicodeケーシングだけでは、ASCII志向のアプローチで処理できるよりもはるかに複雑です。例:
- 「ẞ」の小文字は「ß」ですが、「ß」の大文字は「SS」です。
- ギリシャ語の小文字のシグマは2つありますが、大文字のシグマは1つだけです。 「Σίσυφος」を検討してください。
- 「ø」のような文字は、「o」と発音区別符号に分解されません。つまり、正しくソートされません。
他にも多くの微妙な点があります。
-
utf8_unicode_ci
標準のUnicode Collation Algorithmを使用します 、いわゆる拡張と合字をサポートします。たとえば、ドイツ語の文字ß(U + 00DF LETTER SHARP S)は「ss」の近くに並べ替えられます。
utf8_general_ci
展開/合字をサポートしていません。これらの文字をすべて単一の文字として、場合によっては間違った順序で並べ替えます。
-
utf8_unicode_ci
一般的に すべてのスクリプトでより正確です。たとえば、キリル文字ブロックの場合:utf8_unicode_ci
ロシア語、ブルガリア語、ベラルーシ語、マケドニア語、セルビア語、ウクライナ語で問題ありませんが、utf8_general_ciはキリル文字のロシア語とブルガリア語のサブセットでのみ問題ありません。ベラルーシ語、マケドニア語、セルビア語、ウクライナ語で使用される余分な文字は適切に並べ替えられていません。
utf8_unicode_ci
の費用 それは少しであるということです utf8_general_ci
よりビット低い 。しかし、それはあなたが正しさのために支払う代償です。間違った速い答えか、正しい非常に少し遅い答えのどちらかです。あなたの選択。間違った答えを与えることを正当化することは非常に難しいので、utf8_general_ci
存在せず、常にutf8_unicode_ci
を使用します 。まあ、間違った答えが必要な場合を除いて。
出典: http://forums.mysql.com/read .php?103,187048,188748#msg-188748