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
,则引发错误。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 节“连接字符集和排序规则”)。这仅适用于 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 |
+--------------------------+----------------------------+