Mysqlデータベースに有望なunicodeの2つのオプションがあります。
utf8_general_ci unicode (multilingual), case-insensitive
utf8_unicode_ci unicode (multilingual), case-insensitive
Utf8_general_ciとutf8_unicode_ciの違いを教えてください。データベースを設計するときに、一方を選択するとどのような影響がありますか?
utf8_general_ci
は、非常に単純な(Unicodeでは非常に壊れた)照合であり、一般的なUnicodeテキストに対して誤った結果を与える照合です。それは何ですか:
これは、Unicodeの大文字小文字を理解しないため、Unicodeでは正しく機能しません。 Unicodeのケーシングだけでは、ASCII指向のアプローチで処理できるよりもはるかに複雑です。例えば:
他にも多くの微妙な点があります。
utf8_unicode_ci
は標準を使用します Unicode Collation Algorithm 、サポートいわゆる拡張と合字。たとえば、ドイツ語の文字ß(U + 00DF LETTER SHARP S)は「ss」の近くにソートされます。文字Œ(U + 0152 LATIN CAPITAL LIGATURE OE)は「OE」の近くにソートされます。utf8_general_ci
は展開/合字をサポートしていません。これらのすべての文字を単一の文字として並べ替え、時には間違った順序で並べます。
utf8_unicode_ci
は、すべてのスクリプトに対して一般的により正確です。たとえば、キリル文字ブロック:utf8_unicode_ci
は、ロシア語、ブルガリア語、ベラルーシ語、マケドニア語、セルビア語、ウクライナ語のすべての言語に適しています。 utf8_general_ciは、キリル文字のロシア語およびブルガリア語のサブセットに対してのみ有効です。ベラルーシ語、マケドニア語、セルビア語、およびウクライナ語で使用される余分な文字は、うまくソートされていません。utf8_unicode_ci
のコストは、utf8_general_ci
よりもlittleビットが遅いことです。しかし、それはあなたが正確さのために支払う代償です。間違った速い答えをすることも、少し遅い遅い答えをすることもできます。あなたの選択。間違った答えを与えることを正当化することは非常に難しいため、utf8_general_ci
が存在しないと仮定し、常にutf8_unicode_ci
を使用することをお勧めします。まあ、間違った答えを望まない限り。
ソース: http://forums.mysql.com/read.php?103,187048,188748#msg-188748
MySQLドキュメント の nicode Character Sets から:
Unicode文字セットの場合、
_general_ci
照合を使用して実行される操作は、_unicode_ci
照合の操作よりも高速です。たとえば、utf8_general_ci
照合の比較は、utf8_unicode_ci
の比較よりも高速ですが、わずかに正確ではありません。これは、utf8_unicode_ci
が展開などのマッピングをサポートしているためです。つまり、1つの文字が他の文字の組み合わせと等しいと比較される場合。たとえば、ドイツ語および他のいくつかの言語では、「ß
」は「ss
」と同じです。utf8_unicode_ci
は、収縮と無視可能な文字もサポートしています。utf8_general_ci
は、拡張、縮小、または無視可能な文字をサポートしないレガシー照合です。文字間で1対1の比較のみを行うことができます。