在SQL语句中校验字符集
字符串文字,十六进制文字或位值文字可以具有可选的字符集介绍程序和COLLATE
子句,以将其指定为使用特定字符集和校验规则的字符串:
[_charset_name] literal [COLLATE collation_name]
该表达式正式称为校验。它告诉解析器,“其后的字符串使用字符集。”导引器不会改变像串介绍人字符集会做。尽管可能会发生填充,但它不会更改字符串值。引入器只是一个信号。_charset_name
charset_name
CONVERT()
对于字符串文字,引入程序和字符串之间的空格是允许的,但是可选的。
对于字符集文字,介绍程序会指示以下字符串的字符集,但不会更改解析器在字符串内执行转义处理的方式。解析器始终根据给出的字符集来解释转义character_set_connection
。有关其他讨论和示例,请参见“字符串字符集和校验规则”。
例子:
SELECT 'abc';SELECT _latin1'abc';SELECT _binary'abc';SELECT _utf8mb4'abc'COLLATE utf8mb4_danish_ci;SELECT _latin1 X'4D7953514C';SELECT _utf8mb4 0x4D7953514CCOLLATE utf8mb4_danish_ci;SELECT _latin1 b'1000001';SELECT _utf8mb4 0b1000001COLLATE utf8mb4_danish_ci;
字符集介绍程序和COLLATE
子句是根据标准SQL规范实现的。
可以使用_binary
介绍程序将字符串文字指定为二进制字符串。十六进制文字和位值文字默认情况下为二进制字符串,因此_binary
是允许的,但通常是不必要的。_binary
将十六进制或位文字保留为二进制字符串可能会很有用,否则会将文字视为数字。例如,位操作允许在MySQL 8.0及更高版本中使用数字或二进制字符串参数,但默认情况下将十六进制和位文字视为数字。要为此类文字明确指定二进制字符串上下文,请_binary
对至少一个参数使用一个引言:
mysql>SET @v1 = X'000D' | X'0BC0'; mysql>SET @v2 = _binary X'000D' | X'0BC0'; mysql>SELECT HEX(@v1), HEX(@v2); +---------- +---------- + | HEX(@v1) | HEX(@v2) | +---------- +---------- + | BCD | 0BCD | +---------- +---------- +
对于两个位操作,显示的结果看起来都相似,但是不带结果_binary
是一个BIGINT
值,而带结果_binary
是一个二进制字符串。由于结果类型的不同,显示的值也不同:数字结果不显示高阶0位数。
MySQL通过以下方式确定字符串文字,十六进制文字或位值文字的字符集和校验规则:
- 如果同时
_charset_name
和指定,字符集和校验规则使用。必须是的允许校验规则。COLLATE collation_name
charset_name
collation_name
collation_name
charset_name
- 如果
_charset_name
指定但未COLLATE
指定,charset_name
则使用字符集及其默认校验规则。要参见每个字符集的默认校验规则,请使用SHOW CHARACTER SET
语句或查询INFORMATION_SCHEMA
CHARACTER_SETS
表。 如果
_charset_name
未指定,但已指定:COLLATE collation_name
- 对于字符串文字,使用
character_set_connection
系统变量和校验规则给定的连接默认字符集collation_name
。collation_name
必须是连接默认字符集的允许校验规则。 - 对于十六进制文字或位值文字,唯一允许的归类是
binary
因为默认情况下这些文字类型是二进制字符串。
- 对于字符串文字,使用
否则(
_charset_name
未指定):COLLATE collation_name
- 对于字符串文字,将使用
character_set_connection
和collation_connection
系统变量给出的连接默认字符集和校验规则。 - 对于十六进制文字或位值文字,字符集和校验规则为
binary
。
- 对于字符串文字,将使用
例子:
具有
latin1
字符集和latin1_german1_ci
校验规则的非二进制字符串:SELECT _latin1'Müller'COLLATE latin1_german1_ci;SELECT _latin1 X'0A0D'COLLATE latin1_german1_ci;SELECT _latin1 b'0110'COLLATE latin1_german1_ci;具有
utf8mb4
字符集及其默认校验规则(即utf8mb4_0900_ai_ci
)的非二进制字符串:SELECT _utf8mb4'Müller';SELECT _utf8mb4 X'0A0D';SELECT _utf8mb4 b'0110';具有
binary
字符集及其默认校验规则(即binary
)的二进制字符串:SELECT _binary'Müller';SELECT X'0A0D';SELECT b'0110';十六进制文字和位值文字不需要引入符,因为默认情况下它们是二进制字符串。
具有连接默认字符集和
utf8mb4_general_ci
校验规则的非二进制字符串(如果连接字符集不是,则失败utf8mb4
):SELECT 'Müller'COLLATE utf8mb4_general_ci;此构造(
COLLATE
仅)不适用于十六进制文字或位文字,因为它们的字符集binary
与连接字符集无关,并且binary
与utf8mb4_general_ci
校验规则不兼容。COLLATE
在没有介绍人的情况下,唯一允许的子句是COLLATE binary
。具有连接默认字符集和校验规则的字符串:
SELECT 'Müller';