B.4.4.1 字符串搜索中的区分大小写

对于非二进制字符串(CHARVARCHARTEXT),字符串搜索使用比较操作数的排序规则。对于二进制字符串(BINARYVARBINARYBLOB),比较使用操作数中字节的数值;这意味着对于字母字符,比较将区分大小写。

非二进制字符串和二进制字符串之间的比较被视为二进制字符串的比较。

简单的比较操作(>=, >, =, <, <=,排序和分组)基于每个字符的“排序值”。具有相同排序值的字符被视为相同字符。例如,如果eé在给定的排序规则中具有相同的排序值,则它们比较相等。

默认字符集和排序规则是latin1latin1_swedish_ci,因此默认情况下非二进制字符串比较不区分大小写。这意味着,如果您搜索col_name LIKE 'a%',则将获得以Aa开头的所有列值。要使此搜索区分大小写,请确保其中一个操作数具有区分大小写或二进制排序规则。例如,如果要比较都具有latin1字符集的列和字符串,则可以使用COLLATE运算符来使两个操作数具有latin1_general_cslatin1_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.18 节“ 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的上下文是用于压缩函数的,它们通常会返回二进制字符串:string:

mysql> SELECT COLLATION(COMPRESS('x'));
+--------------------------+
| COLLATION(COMPRESS('x')) |
+--------------------------+
| binary                   |
+--------------------------+

要检查字符串的排序值,WEIGHT_STRING()可能会有所帮助。参见第 12.7 节“字符串函数和运算符”