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 Y
和COLLATE Z
,则引发错误。 -
否则,如果所有排序规则均为*
Y
,请使用Y
*。 -
否则,结果将没有排序规则。
例如,使用CASE ... WHEN a THEN b WHEN b THEN c COLLATE X END
,结果归类为* X
*。 UNION,||,CONCAT(),ELT(),GREATEST(),IF()和LEAST()同样适用。
对于转换为字符数据的操作,由这些操作产生的字符串的字符集和排序规则由character_set_connection和collation_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 |
+--------------------------+----------------------------+