1. ホーム
  2. mysql

[解決済み] utf8_general_ciとutf8_unicode_ciの違いは何ですか?重複

2023-03-26 12:47:17

質問

重複の可能性があります。

utf8_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 の違いについて説明してください。データベースを設計する際に、どちらかを選択するとどのような影響がありますか?

どのように解決するのですか?

utf8_general_ci は非常に単純で、Unicode 上では非常に壊れている照合順序で、次のようになります。 不正確な結果 を与えるものです。 これは何をするかというと

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

これはUnicode上では正しく動作しません。なぜなら、Unicodeのケーシングを理解できないからです。Unicode のケーシングだけでも、ASCII を意識したアプローチでは処理しきれないほど複雑です。たとえば

  • ǩ」の小文字は「ß」ですが、「ß」の大文字は「SS」です。
  • ギリシャ語のシグマは小文字は2つありますが、大文字は1つしかありません。"Σίσυφος "を考えてみてください。
  • ø" のような文字は "o" と発音区分符号に分解されないので、正しくソートされません。

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

  1. utf8_unicode_ci は、標準の Unicode 照合順序アルゴリズム は、いわゆる拡張や合字をサポートしており、例えば、以下のようになります。 ドイツ語の文字 ß (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 . しかし、これは正しさの代償なのです。間違っている速い答えがあるか、正しいが非常に遅い答えがあるか、どちらかです。どちらを選ぶかはあなた次第です。 間違った答えを出すことを正当化することは非常に難しいので、以下のように仮定するのがベストです。 utf8_general_ci は存在しないと仮定して、常に utf8_unicode_ci . まあ、間違った答えを出したいなら別ですが。

ソースはこちら http://forums.mysql.com/read.php?103,187048,188748#msg-188748