15

utf8_general_ci (大文字と小文字を区別しない) を使用する mysql データベースがあり、テーブルには大文字と小文字を区別するデータ (例: 'iSZ6fX' または 'AscSc2') を含む ID のような列があります。

大文字と小文字を区別するには、次のように、これらの列に utf8_bin のみを設定することをお勧めします。

CREATE TABLE  `test` (
`id` VARCHAR( 32 ) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL ,
`value1` VARCHAR( 255 ) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL
) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_general_ci

または、すべての列で utf8_general_ci を使用し、php クエリで「BINARY」を使用します。次に例を示します。

mysqli_query( $link, "SELECT * FROM table WHERE BINARY id = 'iSZ6fX'" );
4

3 に答える 3

18

照合を使用することをお勧めし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値順に並んでいます。しかし、バイトごとの比較を使用する場合、> .0xef0xf0utf160xff0xd8

そのため、MySQL のutf16_bin照合は「バイトごと」ではありません。それは「コードポイントごと」です。MySQL が で補助文字エンコーディングをutf16検出すると、文字のコード ポイント値に変換してから比較します。したがって、utf8_binutf16_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
于 2013-09-11T09:56:50.200 に答える
1

エラーの可能性を減らすため、クエリで条件を指定するよりも、「utf8_bin」で列を使用することをお勧めします。

于 2013-09-11T09:52:25.003 に答える
0

列属性としての BINARY の効果は、MySQL 4.1 より前の効果とは異なります。以前は、BINARY の結果、バイナリ文字列として扱われる列が生成されました。バイナリ文字列は、文字セットまたは照合順序を持たないバイトの文字列であり、バイナリ照合順序を持つ非バイナリ文字列とは異なります。

でも今

BINARY 演算子は、それに続く文字列をバイナリ文字列にキャストします。これは、比較を文字単位ではなくバイト単位で行う簡単な方法です。BINARY を使用すると、末尾のスペースも重要になります。BINARY str は、CAST(str AS BINARY) の省略形です。

文字列定義の BINARY 属性には、別の効果があります。BINARY 属性で定義された文字列には、列文字セットのバイナリ照合順序が割り当てられます。すべての文字セットにはバイナリ照合があります。たとえば、latin1 文字セットのバイナリ照合順序は latin1_bin であるため、テーブルの既定の文字セットが latin1 の場合、これら 2 つの列定義は同等です。

CHAR(10) BINARY

CHAR(10) CHARACTER SET latin1 COLLATE latin1_bin
于 2013-09-11T09:53:22.440 に答える