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
第
10.4 节,“连接字符集和排序规则”) . 这仅适用于、
、
、
和
。
collation_connection
CAST()
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 |
+--------------------------+----------------------------+