字符集和函数结果的校验(COLLATION)
MySQL有许多返回字符串的运算符和函数。本节回答以下问题:这样的字符串的字符集和校验规则是什么?
对于采用字符串输入并返回字符串结果作为输出的简单函数,输出的字符集和校验规则与主体输入值的字符集和校验规则相同。例如,返回具有与相同的字符串和校验规则的字符串。这同样适用于INSTR()、LCASE()、LOWER()、LTRIM()、MID()、REPEAT()、REPLACE()、REVERSE()、RIGHT()、RPAD()、RTRIM()、SOUNDEX()、SUBSTRING()、TRIM()、UCASE()、UPPER()和UPPER(X)
注意
REPLACE()与所有其他函数不同,该函数始终忽略字符串输入的校验规则,并执行区分大小写的比较。
如果字符串输入或函数结果是二进制字符串,则该字符串具有binary字符集和校验规则。可以使用CHARSET()和COLLATION()函数进行检查,这两个函数都返回binary一个二进制字符串参数:
mysql>SELECT CHARSET(BINARY 'a'), COLLATION(BINARY 'a'); +--------------------- +----------------------- + | CHARSET(BINARY 'a') | COLLATION(BINARY 'a') | +--------------------- +----------------------- + | binary | binary | +--------------------- +----------------------- +
对于组合多个字符串输入并返回单个字符串输出的操作,标准SQL 的“聚合规则”适用于确定结果的校验规则:
- 如果显式出现,请使用。
COLLATE YY - 如果明确和发生,引发错误。
COLLATE YCOLLATE Z - 否则,如果所有校验规则都是
Y,请使用Y。 - 否则,结果将没有校验规则。
例如,对于CASE...WHEN a THEN b WHEN b THEN c 校验至于x结束时,得到的校验规则是x。这同样适用于UNION、||、CONCAT()、ELT()、magest()、IF()和LEAST()。
对于转换为字符数据的操作,由character_set_connection和定义collation_connection默认连接字符集和校验规则的系统变量定义了操作产生的字符串的字符集和校验规则(请参见“连接字符集和校验规则”)。这仅适用于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 | utf8 | utf8_general_ci | +---------------- +----------------- +------------------- + mysql>SELECT CHARSET(COMPRESS('abc')), COLLATION(COMPRESS('abc')); +-------------------------- +---------------------------- + | CHARSET(COMPRESS('abc')) | COLLATION(COMPRESS('abc')) | +-------------------------- +---------------------------- + | binary | binary | +-------------------------- +---------------------------- +
