12.3.8 字符集介绍符
字符字符串字面量、十六进制字面量或位值字面量可以有可选的字符集引入符和COLLATE
子句,以指定使用特定的字符集和排序规则:
[_charset_name] literal [COLLATE collation_name]
代码_
称为引入符。它告诉解析器,“接下来跟随的字符串使用字符集charset_name
charset_name
。”引入符不像CONVERT()
一样改变字符串,而是只是一个信号。虽然可能会出现填充,但不会改变字符串值。
对于字符字符串字面量,引入符和字符串之间的空格允许但不强制要求。
对于字符集字面量,引入符表示后续字符串的字符集,但是解析器在处理字符串中的转义字符时不会改变。转义字符总是根据character_set_connection
给定的字符集进行解释。关于更多讨论和示例,见第12.3.6节,“字符字符串字面量字符集和排序规则”。
示例:
SELECT 'abc';
SELECT _latin1'abc';
SELECT _binary'abc';
SELECT _utf8mb4'abc' COLLATE utf8mb4_danish_ci;
SELECT _latin1 X'4D7953514C';
SELECT _utf8mb4 0x4D7953514C COLLATE utf8mb4_danish_ci;
SELECT _latin1 b'1000001';
SELECT _utf8mb4 0b1000001 COLLATE utf8mb4_danish_ci;
字符集引入符和COLLATE
子句遵循标准SQL规范实现。
字符字符串字面量可以使用_binary
引入符来指定为二进制字符串。十六进制字面量和位值字面量默认是二进制字符串,所以_binary
允许,但通常不必要。在 MySQL 8.4 及更高版本中,bit 操作允许数字或二进制字符串参数,但是默认将十六进制和位字面量视为数字。要在上下文中明确指定二进制字符串上下文,可以使用至少一个参数的_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 |
+----------+----------+
显示结果对比bit 操作类似,但是没有_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
。必须是连接默认字符集的允许排序规则。 -
对于十六进制字面量或位值字面量,唯一允许的排序规则是
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_0900_ai_ci
排序规则的非二进制字符串(在连接字符集不是utf8mb4
时失败):SELECT 'Müller' COLLATE utf8mb4_0900_ai_ci;
这构造(只限于
COLLATE
)对于十六进制字面量或位值字面量不起作用,因为它们的字符集总是binary
binary
与utf8mb4_0900_ai_ci
排序规则不兼容。唯一允许的COLLATE
子句在无引导符情况下是COLLATE binary
。 -
使用连接默认字符集和排序规则的字符串:
SELECT 'Müller';