Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

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 是可选的,但通常不必要。_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_nameCOLLATE collation_name,则使用字符集 charset_name 和排序 collation_namecollation_name 必须是 charset_name 的允许排序。

  • 如果指定了 _charset_name 但未指定 COLLATE,则使用字符集 charset_name 及其默认排序规则。要查看每个字符集的默认排序规则,请使用 SHOW CHARACTER SET 语句或查询 INFORMATION_SCHEMA CHARACTER_SETS 表。

  • 如果未指定 _charset_name 但指定了 COLLATE collation_name

    • 对于字符字符串文字,使用连接默认字符集由 character_set_connection 系统变量指定的字符集和排序规则 collation_namecollation_name 必须是连接默认字符集的允许排序规则。

    • 对于十六进制文字或位值文字,只允许使用 binary 排序规则,因为这些类型的文字默认是二进制字符串。

  • 否则(既没有指定 _charset_name 也没有指定 COLLATE collation_name):

    • 对于字符字符串文字,使用连接默认字符集和排序规则由 character_set_connectioncollation_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';