对于非二进制字符串 (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
如果您想让列总是以大小写敏感方式处理,请使用大小写敏感或二进制排序规则声明它。见 第 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
,例如压缩函数,它们通常返回二进制字符串:
mysql> SELECT COLLATION(COMPRESS('x'));
+--------------------------+
| COLLATION(COMPRESS('x')) |
+--------------------------+
| binary |
+--------------------------+
要检查字符串的排序值,可以使用 WEIGHT_STRING()
函数。请参阅 第 14.8 节,“字符串函数和操作符”。