Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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_nameCOLLATE collation_name,则使用字符集charset_name和排序collation_namecollation_name必须是charset_name允许的排序。

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

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

    • 对于字符字符串字面量,使用连接默认字符集由character_set_connection系统变量和排序规则collation_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)对于十六进制字面量或位值字面量不起作用,因为它们的字符集总是binarybinaryutf8mb4_0900_ai_ci排序规则不兼容。唯一允许的COLLATE子句在无引导符情况下是COLLATE binary

  • 使用连接默认字符集和排序规则的字符串:

    SELECT 'Müller';