字符字符串文字、十六进制文字或位值文字可以有一个可选的字符集引入器和 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
是可选的,但通常不必要。_binary
可能有助于在某些情况下将十六进制或位文字保留为二进制字符串。例如,在位操作中,允许数字或二进制字符串参数,但十六进制和位文字默认被视为数字。要明确指定二进制字符串上下文,至少需要使用 _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_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';