web-dev-qa-db-ja.com

バイナリ照合を使用するとどのような影響がありますか?

この質問 に答えている間に、十分な答えを見つけることができなかった何かについて確信が持てなくなりました。

バイナリを使用することの実際的な違いは何ですかutf8_binおよび大文字と小文字を区別しないutf8_general_ci照合?

私は3つ見ることができます:

  1. どちらも並べ替え順序が異なります。 _binの並べ替え順序では、バイト値が比較されるため、ウムラウトがアルファベットの最後に配置される可能性があります(正しいですか?)

  2. 大文字小文字を区別する検索のみ_bin

  3. 番号 A = Ä等しい_bin

他に注意すべき違いや副作用はありますか?

参照:

この問題に対応していない同様の質問:

47
Pekka

バイナリ照合は、文字が異なる場合(Cのstrcmp()が行うのとまったく同じように、文字列を比較します(大文字と小文字の区別または区別記号の違いにかかわらず))。欠点は、ソート順が自然ではないことです。

不自然な並べ替え順序の例( "binary"の場合):A、B、a、bこの場合、自然な並べ替え順序は次のようになります。例:A、a、B、b隣同士)

文字列の比較は非常に単純/高速であるため、バイナリ照合の実際的な利点はその速度です。一般的に、バイナリを使用したインデックスでは、ソートに対して期待した結果が得られない可能性がありますが、完全一致の場合は役立ちます。

51

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

13
HaloWebMaster

他の答えは違いをよく説明しています。

バイナリ照合はいくつかの場合に役立ちます:

  • 列には、パスワードハッシュのような16進データが含まれます
  • ソートではなく、完全一致のみに関心がある
  • [a-z0-9_]文字のみの識別子の場合、並べ替えに使用することもできます
  • 何らかの理由でCHAR()列またはVARCHAR列(電話など)に数値を格納する
  • 郵便番号
  • UUID

これらすべてのケースで、バイナリ照合を使用すると、CPUサイクルを(少し)節約できます。

1
peufeu

tf8_general_ciを使用すると、大文字と小文字とアクセントを考慮せずに一致が発生します。単語に対してクエリを実行する必要がある場合、それは良いことかもしれません。

tf8_binでは、文字列が厳密に同じである場合にのみ一致が発生します。クエリはこのように高速です。

0
Mathieu Rodic