web-dev-qa-db-ja.com

utf8_binとutf8_general_csは同じですか?

ここに状況があります:

  1. tf8_bin vs tf8_general_ci "の投稿をいくつか見つけました。
  2. 同様に、「tf8_general_cs vs tf8_general_ci "。

しかし、「tf8_bin vs tf8_general_cs "の投稿が見つかりません。それで、それらは同じですか?そうでない場合、それらの違いは何ですか?

注:tf8_general_csがデフォルトのMySQLでは使用できないことを確認しました。なぜでしょうか。

3
Dinesh Kumar

バイナリ照合順序は大文字と小文字を区別する照合順序と同じであるという考えは、残念ながら非常に一般的なものです。

ただし、機能的に同等ではありません。行動の違いが見られる領域は4つあります(少なくとも4つは私が認識しています)。

  1. 文字の組み合わせ

    小文字のü(分音符号付きの "u")と大文字のÜ(分音符号付きの "U")の使用を検討してください。どちらの種類の照合でも、それらを区別できます。

    ここで、大文字のÜ(分音記号の組み合わせ)を使用することを検討してください。アクセント記号のないUの後に結合文字を置くと、を取得します。視覚的には、単一のÜ(分音記号付きの "U")と同じです。また、大文字と小文字を区別する(アクセントを区別する)照合順序は、一方が単一のコードポイントで、もう一方が2つのコードポイントの組み合わせであっても、同じであるように見えます。ただし、バイナリ照合はそれらが同じコードポイント(または同じ数のコードポイント)でもないため、それらを等しいと比較することはできません。

  2. 全角文字

    大文字と小文字は区別されますが、幅は区別されない照合順序は、=o==o=を同等と見なすことができます。ただし、バイナリ照合はそれらが異なるコードポイントであるため、同等とは見なされません。

  3. 鈍感なアクセント

    大文字と小文字は区別されるがアクセントは区別されない照合順序は、oôを同等と見なすことができます。ただし、バイナリ照合はそれらが異なるコードポイントであるため、同等とは見なされません。

  4. ソート

    大文字と小文字を区別する照合は、aの前に~を、その後にAをソートします。ただし、バイナリ照合はこれらの同じ文字をA、次にa、次に~の順に並べ替えます。

このすべては私の次の投稿に文書化されています:

いいえ、バイナリ照合順序では大文字と小文字が区別されません

これはMicrosoft SQL Serverの観点から提示されていますが、動作はUnicode標準で定義されたルールに基づいています。これは、RDBMS、言語、OSなどで同じである必要があります(Unicode標準のバージョンによって若干の違いがあります)使用されており、Unicodeは単なる標準であり、ベンダー間でわずかな変動を伴って実装されているため、だれが実装したのか)。


デフォルトのMySQLではutf8_general_csが使用できないことを確認しました。なぜでしょうか。

私の推測では、「一般的な」照合順序は廃止され、新しい「ユニコード」照合順序および文化固有の照合順序に取って代わられたと思います。 documentation (ページの途中、「For Unicode文字セット、」で始まる段落)でも、次のように述べています。

utf8_general_ciは、拡張、縮小、または無視できる文字をサポートしないレガシー照合です。文字間の比較は1対1しかできません。

「ユニコード」照合は、おそらくデフォルトのソートの重みと照合規則です。カルチャ固有の照合は、重みとルールをそのカルチャに合わせて調整します(デフォルトが正しくない場合)。照合順序が異なる理由の詳細については、次のS.O.に対する私の回答を参照してください。質問:

nvarchar(Unicode)列のCOLLATIONSのポイントは何ですか?

5
Solomon Rutzky