web-dev-qa-db-ja.com

utf8_general_ciとutf8_unicode_ciの違いは何ですか?

可能性のある複製:
tf8_general_ciとutf8_unicode_ciの違いは何ですか

Mysqlデータベースに有望なunicodeの2つのオプションがあります。

utf8_general_ci unicode (multilingual), case-insensitive
utf8_unicode_ci unicode (multilingual), case-insensitive

Utf8_general_ciとutf8_unicode_ciの違いを教えてください。データベースを設計するときに、一方を選択するとどのような影響がありますか?

82
reconbot

utf8_general_ciは、非常に単純な(Unicodeでは非常に壊れた)照合であり、一般的なUnicodeテキストに対して誤った結果を与える照合です。それは何ですか:

  • 正規分解のためにUnicode正規化形式Dに変換します
  • 結合文字を削除します
  • 大文字に変換します

これは、Unicodeの大文字小文字を理解しないため、Unicodeでは正しく機能しません。 Unicodeのケーシングだけでは、ASCII指向のアプローチで処理できるよりもはるかに複雑です。例えば:

  • 「ẞ」の小文字は「ß」ですが、「ß」の大文字は「SS」です。
  • ギリシャ語の小文字のシグマは2つありますが、大文字のシグマは1つだけです。 「Σίσυφος」を検討してください。
  • 「ø」などの文字は「o」と発音区別記号に分解されないため、正しくソートされません。

他にも多くの微妙な点があります。

  1. utf8_unicode_ciは標準を使用します Unicode Collat​​ion Algorithm 、サポートいわゆる拡張と合字。たとえば、ドイツ語の文字ß(U + 00DF LETTER SHARP S)は「ss」の近くにソートされます。文字Œ(U + 0152 LATIN CAPITAL LIGATURE OE)は「OE」の近くにソートされます。

utf8_general_ciは展開/合字をサポートしていません。これらのすべての文字を単一の文字として並べ替え、時には間違った順序で並べます。

  1. 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

129
Timotei

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の比較のみを行うことができます。

20
Gumbo