12.7.3 字符集和函数结果的整理

MySQL 有许多返回字符串的运算符和函数。本节回答以下问题:这样的字符串的字符集和排序规则是什么?

对于采用字符串 Importing 并返回字符串结果作为输出的简单函数,输出的字符集和排序规则与主体 Importing 值的字符集和排序规则相同。例如,UPPER(X)返回的字符串与* X *具有相同的字符串和排序规则。 INSTR()LCASE()LOWER()LTRIM()MID()REPEAT()REPLACE()REVERSE()RIGHT()RPAD()RTRIM()SOUNDEX()SUBSTRING()TRIM()UCASE()UPPER()同样适用。

Note

REPLACE()函数与所有其他函数不同,始终忽略字符串 Importing 的排序规则并执行区分大小写的比较。

如果字符串 Importing 或函数结果是二进制字符串,则该字符串具有binary字符集和排序规则。可以使用CHARSET()COLLATION()函数进行检查,这两个函数都为二进制字符串参数返回binary

mysql> SELECT CHARSET(BINARY 'a'), COLLATION(BINARY 'a');
+---------------------+-----------------------+
| CHARSET(BINARY 'a') | COLLATION(BINARY 'a') |
+---------------------+-----------------------+
| binary              | binary                |
+---------------------+-----------------------+

对于组合多个字符串 Importing 并返回单个字符串输出的操作,标准 SQL 的“聚合规则”适用于确定结果的排序规则:

  • 如果出现明确的COLLATE Y,请使用* Y *。

  • 如果出现明确的COLLATE YCOLLATE Z,则引发错误。

  • 否则,如果所有排序规则均为* Y ,请使用 Y *。

  • 否则,结果将没有排序规则。

例如,使用CASE ... WHEN a THEN b WHEN b THEN c COLLATE X END,结果归类为* X *。 UNION||CONCAT()ELT()GREATEST()IF()LEAST()同样适用。

对于转换为字符数据的操作,由这些操作产生的字符串的字符集和排序规则由character_set_connectioncollation_connection系统变量定义,这些系统变量确定默认的连接字符集和排序规则(请参见第 10.4 节“连接字符集和排序规则”)。这仅适用于CAST()CONV()FORMAT()HEX()SPACE()

从 MySQL 5.7.19 开始,虚拟生成的列的 table 达式发生了上述原理的 exception。在此类 table 达式中,table 字符集用于CONV()HEX()结果,而与连接字符集无关。

如果对字符串函数返回的字符集或结果排序规则有任何疑问,请使用CHARSET()COLLATION()函数查找:

mysql> SELECT USER(), CHARSET(USER()), COLLATION(USER());
+----------------+-----------------+-------------------+
| USER()         | CHARSET(USER()) | COLLATION(USER()) |
+----------------+-----------------+-------------------+
| test@localhost | utf8            | utf8_general_ci   |
+----------------+-----------------+-------------------+
mysql> SELECT CHARSET(COMPRESS('abc')), COLLATION(COMPRESS('abc'));
+--------------------------+----------------------------+
| CHARSET(COMPRESS('abc')) | COLLATION(COMPRESS('abc')) |
+--------------------------+----------------------------+
| binary                   | binary                     |
+--------------------------+----------------------------+