MySQL 有许多返回字符串的运算符和函数。本节回答问题:这样一个字符串的字符集和排序规则是什么?
对于接受字符串输入并返回字符串结果作为输出的简单函数,输出的字符集和排序规则与主要输入值的字符集和排序规则相同。例如,
返回与 具有相同字符串和排序规则的字符串
。这同样适用于
,
,
,
,
,
,
,
,
,
,
,
,
,
,
和
。
UPPER(X)XINSTR()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 的“聚合规则”适用于确定结果的排序规则:
如果发生显式,请使用 .
COLLATEYY如果显式并发生,则引发错误。
COLLATEYCOLLATEZ否则,如果所有排序规则都是
Y,请使用Y。否则,结果没有排序规则。
例如,对于,生成的排序规则是。这同样适用于,
,
,
,
,
和
。
CASE ... WHEN a THEN b WHEN b THEN c
COLLATE X ENDXUNION||CONCAT()ELT()GREATEST()IF()LEAST()
对于转换为字符数据的操作,操作产生的字符串的字符集和排序
规则由确定默认连接字符集和排序规则的系统变量定义(请参阅character_set_connection第
10.4 节,“连接字符集和排序规则”) . 这仅适用于、
、
、
和
。
collation_connectionCAST()CONV()FORMAT()HEX()SPACE()
从 MySQL 5.7.19 开始,虚拟生成列的表达式出现上述原则的例外情况。在此类表达式中,表字符集用于
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 |
+--------------------------+----------------------------+