字符串搜索中的区分大小写
对于非二进制字符串(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_nameCOLLATE utf8mb4_0900_as_cs LIKE 'a%' col_name LIKE 'a%'COLLATE utf8mb4_0900_as_cs col_nameCOLLATE utf8mb4_bin LIKE 'a%' col_name LIKE 'a%'COLLATE utf8mb4_bin
如果希望始终以区分大小写的方式对待列,请使用区分大小写或二进制排序规则进行声明。请参见“ 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 @s1COLLATE 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(@sUSING 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
是压缩函数,这些函数通常会返回二进制字符串:string:
mysql>SELECT COLLATION(COMPRESS('x')); +-------------------------- + | COLLATION(COMPRESS('x')) | +-------------------------- + | binary | +-------------------------- +
要检查字符串的排序值,WEIGHT_STRING()
可能会有所帮助。请参见“字符串函数和运算符”。