14.8.3 函数结果的字符集和排序规则
MySQL 中有许多返回字符串的操作符和函数。这部分回答的问题:函数结果的字符集和排序规则是什么?
对于简单的函数,它们将输入字符串和输出字符串的字符集和排序规则设置为输入字符串的字符集和排序规则。例如,UPPER(
将返回与 X
)X
相同的字符集和排序规则。同样适用于INSTR()
、LCASE()
、LOWER()
、LTRIM()
、MID()
、REPEAT()
、REPLACE()
、REVERSE()
、RIGHT()
、RPAD()
、RTRIM()
、SOUNDEX()
、SUBSTRING()
、TRIM()
、UCASE()
和 UPPER()
.
不同的是,REPLACE()
函数总是忽略字符串输入的排序规则,并进行大小写敏感比较。
如果字符串输入或函数结果是二进制字符串,那么字符串将具有 binary
字符集和排序规则。这可以通过使用CHARSET()
和COLLATION()
函数来检查,两个函数都将返回 binary
对于二进制字符串参数:
mysql> SELECT CHARSET(BINARY 'a'), COLLATION(BINARY 'a');
+---------------------+-----------------------+
| CHARSET(BINARY 'a') | COLLATION(BINARY 'a') |
+---------------------+-----------------------+
| binary | binary |
+---------------------+-----------------------+
对于组合多个字符串输入并返回单个字符串输出的操作,标准 SQL 的“聚合规则”将用于确定结果的排序规则:
-
如果出现明确的
COLLATE
,使用Y
Y
。 -
如果出现明确的
COLLATE
和Y
COLLATE
,raise an error。Z
-
否则,如果所有排序规则都是
Y
,使用Y
。 -
否则,结果没有排序。
例如,使用CASE ... WHEN a THEN b WHEN b THEN c COLLATE
,结果的排序是X
ENDX
。同样适用于UNION
、||
、CONCAT()
、ELT()
、GREATEST()
、IF()
和LEAST()
。
对于将数据转换为字符数据的操作,字符串结果的字符集和排序由character_set_connection
和collation_connection
系统变量确定,这些变量确定了默认连接字符集和排序(见第12.4节,“Connection Character Sets and Collations”)。这只适用于BIN_TO_UUID()
、CAST()
、CONV()
、FORMAT()
、HEX()
和SPACE()
。
在虚拟生成列表达式中,出现了例外情况。在这些表达式中,表字符集用于BIN_TO_UUID()
、CONV()
或HEX()
结果,无论连接字符集是什么。
如果对结果的字符集或排序有疑问,可以使用CHARSET()
或COLLATION()
函数来确定:
mysql> SELECT USER(), CHARSET(USER()), COLLATION(USER());
+----------------+-----------------+--------------------+
| USER() | CHARSET(USER()) | COLLATION(USER()) |
+----------------+-----------------+--------------------+
| test@localhost | utf8mb3 | utf8mb3_general_ci |
+----------------+-----------------+--------------------+
mysql> SELECT CHARSET(COMPRESS('abc')), COLLATION(COMPRESS('abc'));
+--------------------------+----------------------------+
| CHARSET(COMPRESS('abc')) | COLLATION(COMPRESS('abc')) |
+--------------------------+----------------------------+
| binary | binary |
+--------------------------+----------------------------+