この質問 に答えている間に、十分な答えを見つけることができなかった何かについて確信が持てなくなりました。
バイナリを使用することの実際的な違いは何ですかutf8_bin
および大文字と小文字を区別しないutf8_general_ci
照合?
私は3つ見ることができます:
どちらも並べ替え順序が異なります。 _bin
の並べ替え順序では、バイト値が比較されるため、ウムラウトがアルファベットの最後に配置される可能性があります(正しいですか?)
大文字小文字を区別する検索のみ_bin
番号 A = Ä
等しい_bin
他に注意すべき違いや副作用はありますか?
参照:
この問題に対応していない同様の質問:
バイナリ照合は、文字が異なる場合(Cのstrcmp()が行うのとまったく同じように、文字列を比較します(大文字と小文字の区別または区別記号の違いにかかわらず))。欠点は、ソート順が自然ではないことです。
不自然な並べ替え順序の例( "binary"の場合):A、B、a、bこの場合、自然な並べ替え順序は次のようになります。例:A、a、B、b隣同士)
文字列の比較は非常に単純/高速であるため、バイナリ照合の実際的な利点はその速度です。一般的に、バイナリを使用したインデックスでは、ソートに対して期待した結果が得られない可能性がありますが、完全一致の場合は役立ちます。
utf8_bin
:文字列を、文字列内の各文字のバイナリ値で比較します。
utf8_general_ci
:一般的な言語規則を使用し、大文字と小文字を区別しない比較を使用して文字列を比較します。
utf8_general_cs
:一般的な言語規則と大文字と小文字を区別する比較を使用して文字列を比較します。
たとえば、次はUTF8_general
照合順序のいずれかでtrueと評価されますが、utf8_bin
照合順序では評価されません。
Ä = A
Ö = O
Ü = U
utf8_general_ci
照合を使用すると、同じケースでなくてもtrue
も返します。 http://www.phpbuilder.com/board/showpost.php?s=2e642ac7dc5fceca2dbca1e2b9c424fd&p=10820221&postcount=2
他の答えは違いをよく説明しています。
バイナリ照合はいくつかの場合に役立ちます:
これらすべてのケースで、バイナリ照合を使用すると、CPUサイクルを(少し)節約できます。
tf8_general_ciを使用すると、大文字と小文字とアクセントを考慮せずに一致が発生します。単語に対してクエリを実行する必要がある場合、それは良いことかもしれません。
tf8_binでは、文字列が厳密に同じである場合にのみ一致が発生します。クエリはこのように高速です。