B.3.4.1 字符串搜索中的大小写敏感性
对于非二进制字符串(CHAR
,VARCHAR
,TEXT
),字符串搜索使用比较操作符的排序规则。对于二进制字符串(BINARY
,VARBINARY
,BLOB
),比较使用操作符的字节值;这意味着,对于字母字符,比较是大小写敏感的。
非二进制字符串和二进制字符串之间的比较被视为二进制字符串之间的比较。
简单比较操作(>=, >, =, <, <=
,排序和分组)基于每个字符的““sort value.”。具有相同排序值的字符被视为同一个字符。例如,在某种排序规则下,如果 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
如果您想让一列总是以大小敏感方式处理,使用大小敏感或二进制排序规则。见第15.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()) |
+----------------------+
| utf8mb3_general_ci |
+----------------------+
对于二进制字符串,排序值为binary
,所以比较是敏感的。可以期望在压缩函数中看到binary
:string:
mysql> SELECT COLLATION(COMPRESS('x'));
+--------------------------+
| COLLATION(COMPRESS('x')) |
+--------------------------+
| binary |
+--------------------------+
检查字符串的排序值,可以使用WEIGHT_STRING()
。见第14.8节,“字符串函数和操作符”.