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