照合を使用することをお勧めしutf8_bin
ます。これは、UTF-8 では不可能であっても、一般的なケースでは、同じ文字列を異なるエンコーディングで表現することが理論的に可能である (UTF-16 で発生するなど) ためです。バイナリ比較では理解できませんが、バイナリ照合では理解できます。Unicode Character Setsに記載されているとおり:
「文字のコード値による順序付け」と「文字のバイナリ表現による順序付け」には違いがあります。この違いutf16_bin
は、サロゲートがあるため、 でのみ現れます。
( のバイナリutf16_bin
照合順序utf16
) が、「文字単位」ではなく「バイト単位」のバイナリ比較であったとします。その場合、 の文字の順序は の順序とutf16_bin
は異なりますutf8_bin
。たとえば、次の図は 2 つの珍しい文字を示しています。最初の文字は の範囲E000-FFFF
にあるため、サロゲートよりも大きく、サロゲートよりも小さくなります。2 番目の文字は補足です。
コードポイント 文字 utf8 utf16
---------- ---------- ---- -----
0FF9D 半角カタカナ N EF BE 9D FF 9D
10384 ウガリット文字デルタ F0 90 8E 84 D8 00 DF 84
0xff9d
チャート内の 2 つの文字は、 <であるため、コード ポイント値の順に並べられています0x10384
。そして、 <であるため、それらはutf8
値順に並んでいます。しかし、バイトごとの比較を使用する場合、> .0xef
0xf0
utf16
0xff
0xd8
そのため、MySQL のutf16_bin
照合は「バイトごと」ではありません。それは「コードポイントごと」です。MySQL が で補助文字エンコーディングをutf16
検出すると、文字のコード ポイント値に変換してから比較します。したがって、utf8_bin
とutf16_bin
は同じ順序です。これは、UCS_BASIC 照合に対する SQL:2008 標準要件と一致しています。UCS の文字レパートリーに適用されます。すべての文字レパートリーは UCS レパートリーのサブセットであるため、UCS_BASIC 照合はすべての文字セットに適用できる可能性があります。注 11: 文字の Unicode スカラー値は、符号なし整数として扱われるコード ポイントです。」</p>
したがって、これらの列を含む比較で常に大文字と小文字が区別される場合は、列の照合を に設定する必要がありutf8_bin
ます (クエリで別の指定を忘れた場合でも大文字と小文字が区別されるようにするため)。または、特定のクエリのみで大文字と小文字が区別される場合は、次のキーワードを使用してutf8_bin
照合を使用するように指定できます。COLLATE
SELECT * FROM table WHERE id = 'iSZ6fX' COLLATE utf8_bin