Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Character Set and Collation of Function Results

14.8.3 函数结果的字符集和排序规则

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

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

Note

然而,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 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 系统变量定义,这些变量确定默认连接字符集和排序规则(见 第 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                     |
+--------------------------+----------------------------+