文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  函数结果的字符集和排序规则

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 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                     |
+--------------------------+----------------------------+