非バイナリ文字列の場合 (CHAR
、VARCHAR
、TEXT
)、文字列検索では比較オペランドの照合順序が使用されます。バイナリ文字列の場合 (BINARY
、VARBINARY
、BLOB
)、比較ではオペランドのバイトの数値が使用されます。これは、アルファベット文字の場合、比較で大文字/小文字が区別されることを意味します。
非バイナリ文字列とバイナリ文字列の比較は、バイナリ文字列の比較として扱われます。
単純な比較操作 (>=、>、=、<、<=
、ソート、およびグループ化) は、各文字の「ソート値」に基づきます。同じソート値を持つ文字は同じ文字として扱われます。たとえば、「e
」 と 「é
」 が対象の照合順序で同じソート値を持つ場合は、等しいと判断されます。
デフォルトの文字セットおよび照合順序は latin1
および latin1_swedish_ci
であるため、非バイナリ文字列の比較はデフォルトでは大文字/小文字が区別されません。これは、
を使用して検索した場合、col_name
LIKE 'a%'A
または a
で始まるすべてのカラム値が取得されることを意味します。この検索で大文字/小文字が区別されるようにするには、いずれかのオペランドで大文字/小文字を区別するか、バイナリ照合順序を持つようにします。たとえば、カラムおよび文字列を比較するときに両方が latin1
文字セットである場合は、COLLATE
演算子を使用して、どちらかのオペランドを latin1_general_cs
または latin1_bin
の照合順序にすることができます。
col_name COLLATE latin1_general_cs LIKE 'a%'
col_name LIKE 'a%' COLLATE latin1_general_cs
col_name COLLATE latin1_bin LIKE 'a%'
col_name LIKE 'a%' COLLATE latin1_bin
カラムで常に大文字/小文字が区別して扱われるようにするには、大文字/小文字が区別されるように宣言するか、バイナリ照合順序を指定して宣言します。セクション13.1.17「CREATE TABLE 構文」を参照してください。
非バイナリ文字列の大文字/小文字が区別される比較で大文字/小文字が区別されないようにするには、COLLATE
を使用して、大文字/小文字が区別されない照合順序を指定します。通常、次の例の文字列では大文字/小文字が区別されますが、COLLATE
によって比較で大文字/小文字が区別されないように変更されています。
mysql> SET @s1 = 'MySQL' COLLATE latin1_bin,
-> @s2 = 'mysql' COLLATE latin1_bin;
mysql> SELECT @s1 = @s2;
+-----------+
| @s1 = @s2 |
+-----------+
| 0 |
+-----------+
mysql> SELECT @s1 COLLATE latin1_swedish_ci = @s2;
+-------------------------------------+
| @s1 COLLATE latin1_swedish_ci = @s2 |
+-------------------------------------+
| 1 |
+-------------------------------------+
バイナリ文字列の比較では大文字/小文字が区別されます。この文字列を大文字/小文字が区別されないように比較するには、非バイナリ文字列に変換し、COLLATE
を使用して大文字/小文字が区別されない照合順序を指定します。
mysql> SET @s = BINARY 'MySQL';
mysql> SELECT @s = 'mysql';
+--------------+
| @s = 'mysql' |
+--------------+
| 0 |
+--------------+
mysql> SELECT CONVERT(@s USING latin1) COLLATE latin1_swedish_ci = 'mysql';
+--------------------------------------------------------------+
| CONVERT(@s USING latin1) COLLATE latin1_swedish_ci = 'mysql' |
+--------------------------------------------------------------+
| 1 |
+--------------------------------------------------------------+
値が非バイナリ文字列またはバイナリ文字列のどちらで比較されるかを判別するには、COLLATION()
関数を使用します。次の例は、VERSION()
が大文字/小文字が区別されない照合順序の文字列を返すことを示しており、比較では大文字/小文字が区別されません。
mysql> SELECT COLLATION(VERSION());
+----------------------+
| COLLATION(VERSION()) |
+----------------------+
| utf8_general_ci |
+----------------------+
バイナリ文字列の場合、照合順序値は binary
であり、比較では大文字/小文字が区別されます。binary
が表示される 1 つのコンテキストは、一般的なルールとしてバイナリ文字列を返す圧縮関数および暗号化関数の場合です。
mysql> SELECT COLLATION(ENCRYPT('x')), COLLATION(SHA1('x'));
+-------------------------+----------------------+
| COLLATION(ENCRYPT('x')) | COLLATION(SHA1('x')) |
+-------------------------+----------------------+
| binary | binary |
+-------------------------+----------------------+
文字列のソート値を確認する場合は、WEIGHT_STRING()
が役に立つことがあります。セクション12.5「文字列関数」を参照してください。