2020年以降もこの質問に答える人のために、両方よりも優れている可能性のある新しいオプションがあります。 これらの。例:utf8mb4_0900_ai_ci
。
これらの照合はすべて、UTF-8文字エンコード用です。違いは、テキストの並べ替えと比較の方法にあります。
_unicode_ci
および_general_ci
予想される方法に従ってテキストを並べ替えて比較するための2つの異なるルールセットです。 MySQLの新しいバージョンでは、_0900_ai_ci
などの新しいルールセットも導入されています。 Unicode 9.0に基づく同等のルールの場合、同等の_general_ci
はありません 変異体。これを今読んでいる人は、おそらく_unicode_ci
の代わりに、これらの新しい照合の1つを使用する必要があります。 または_general_ci
。以下の古い照合の説明は、興味を引くためにのみ提供されています。
MySQLは現在、古い欠陥のあるUTF-8実装から移行しています。今のところ、utf8mb4
を使用する必要があります utf8
の代わりに 文字エンコード部分については、修正バージョンを取得していることを確認してください。欠陥のあるバージョンは、廃止されていますが、下位互換性のために残っています。
主な違い
-
utf8mb4_unicode_ci
は、ユニバーサルソートと比較に関する公式のUnicodeルールに基づいており、幅広い言語で正確にソートされます。 -
utf8mb4_general_ci
は、速度を向上させるために設計された多くのショートカットを使用しながら、できる限り実行することを目的とした、簡略化された並べ替えルールのセットです。 Unicodeの規則に準拠していないため、特定の言語や文字を使用する場合など、状況によっては望ましくない並べ替えや比較が発生します。最新のサーバーでは、このパフォーマンスの向上はほとんど無視できます。これは、サーバーのCPUパフォーマンスが今日のコンピューターのごく一部であった時代に考案されました。
utf8mb4_unicode_ci
のメリット utf8mb4_general_ci
以上
utf8mb4_unicode_ci
は、並べ替えと比較にUnicodeルールを使用し、かなり複雑なアルゴリズムを使用して、さまざまな言語で、さまざまな特殊文字を使用するときに正しく並べ替えます。これらのルールは、言語固有の規則を考慮する必要があります。誰もが「アルファベット順」と呼ぶ文字を並べ替えるわけではありません。
ラテン語(つまり「ヨーロッパ」)の言語に関する限り、Unicodeの並べ替えと簡略化されたutf8mb4_general_ci
の間に大きな違いはありません。 MySQLで並べ替えますが、まだいくつかの違いがあります:
-
たとえば、Unicodeの照合では、「ß」は「ss」のように、「Œ」は「OE」のように、これらの文字を使用する人々が通常必要とするように並べ替えますが、
utf8mb4_general_ci
それらを単一の文字としてソートします(おそらくそれぞれ「s」と「e」のように)。 -
一部のUnicode文字は無視可能として定義されています。つまり、並べ替え順序にカウントされるべきではなく、代わりに次の文字に比較が進む必要があります。
utf8mb4_unicode_ci
これらを適切に処理します。
アジア言語やアルファベットの異なる言語などの非ラテン語では、もっと多くの言語が存在する可能性があります。 Unicodeの並べ替えと簡略化されたutf8mb4_general_ci
の違い 並べ替え。 utf8mb4_general_ci
の適合性 使用する言語に大きく依存します。一部の言語では、それはかなり不十分です。
何を使用する必要がありますか?
utf8mb4_general_ci
を使用する理由はほぼ確実にありません。 もう、CPU速度が十分に低く、パフォーマンスの違いが重要になる点を残しているためです。データベースは、これ以外のボトルネックによってほぼ確実に制限されます。
過去には、utf8mb4_general_ci
の使用を推奨する人もいました。 ただし、正確な並べ替えがパフォーマンスコストを正当化するのに十分重要になる場合を除きます。今日、そのパフォーマンスコストはほとんどなくなり、開発者は国際化をより真剣に扱っています。
正確さよりも速度が重要である場合は、並べ替えをまったく行わない方がよいという議論があります。正確である必要がない場合は、アルゴリズムを高速化するのは簡単です。したがって、utf8mb4_general_ci
これは、速度の理由からおそらく必要ではなく、精度の理由からもおそらく適切ではない妥協案です。
もう1つ付け加えておきますが、アプリケーションが英語のみをサポートしていることがわかっている場合でも、人の名前を処理する必要がある場合があります。名前には、正しく並べ替えることが重要な他の言語で使用されている文字が含まれていることがよくあります。 。すべてにUnicodeルールを使用すると、非常に賢いUnicodeの人々が、並べ替えを適切に機能させるために非常に熱心に取り組んできたという安心感を得ることができます。
パーツの意味
まず、ci
大文字と小文字を区別しない 並べ替えと比較。これは、テキストデータに適していることを意味し、大文字と小文字は重要ではありません。他のタイプの照合はcs
です。 (大文字と小文字を区別)大文字と小文字が重要なテキストデータの場合、およびbin
、エンコーディングが一致する必要がある場合、ビットごとに。これは、実際にエンコードされたバイナリデータ(たとえば、Base64を含む)であるフィールドに適しています。大文字と小文字を区別する並べ替えは奇妙な結果につながり、大文字と小文字を区別する比較では、大文字と小文字のみが異なる重複値が生じる可能性があるため、大文字と小文字を区別する照合はテキストデータに不利になります-大文字と小文字が重要な場合は、句読点を無視できますなどもおそらく重要であり、バイナリ照合の方が適切な場合があります。
次に、unicode
またはgeneral
特定の並べ替えと比較のルール、特にテキストの正規化または比較の方法を指します。 unicode
を使用した、utf8mb4文字エンコードにはさまざまなルールセットがあります。 およびgeneral
1つの特定の言語ではなく、すべての可能な言語でうまく機能しようとする2つです。これらの2つのルールセットの違いがこの回答の主題です。 unicode
に注意してください Unicode4.0のルールを使用します。 MySQLの最近のバージョンでは、ルールセットunicode_520
が追加されています Unicode 5.2のルール、および0900
を使用する (「unicode_」部分を削除)Unicode9.0のルールを使用します。
そして最後に、utf8mb4
もちろん、内部で使用される文字エンコードです。この回答では、Unicodeベースのエンコーディングについてのみ話しています。