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


MySQL 8.4 Reference Manual  /  ...  /  Character String Literal Character Set and Collation

12.3.6 字符串文字的字符集和排序规则

每个字符字符串字面量都有一个字符集和排序规则。

对于简单语句SELECT 'string', 字符串使用连接默认的字符集和排序规则,定义于character_set_connectioncollation_connection 系统变量。

字符字符串字面量可以有可选的字符集引入符和COLLATE子句,以指定使用特定的字符集和排序规则:

[_charset_name]'string' [COLLATE collation_name]

代码《charset_name引入符。它告诉解析器,“字符串后面使用字符集《charset_name。引入符不像CONVERT()一样改变字符串,而是只是一个信号。见第12.3.8节,“字符集引入符”

示例:

SELECT 'abc';
SELECT _latin1'abc';
SELECT _binary'abc';
SELECT _utf8mb4'abc' COLLATE utf8mb4_danish_ci;

字符集引入符和COLLATE子句遵循标准SQL规范。

MySQL 根据以下方式确定字符字符串字面量的字符集和排序规则:

  • 如果同时指定了_charset_nameCOLLATE collation_name,则使用字符集charset_name和排序规则collation_name。必须是charset_name允许的排序规则。

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

  • 如果未指定_charset_name但指定了COLLATE collation_name,则使用连接默认字符集由character_set_connection系统变量给定的字符集和排序规则collation_name。必须是连接默认字符集允许的排序规则。

  • 否则(既没有指定_charset_name也没有指定COLLATE collation_name),将使用连接默认的字符集和排序规则,取自character_set_connectioncollation_connection系统变量。

示例:

  • 使用latin1字符集和latin1_german1_ci排序规则的非二进制字符串:

    SELECT _latin1'Müller' COLLATE latin1_german1_ci;
  • 使用utf8mb4字符集及其默认排序规则(即utf8mb4_0900_ai_ci):

    SELECT _utf8mb4'Müller';
  • 使用binary字符集及其默认排序规则(即binary):

    SELECT _binary'Müller';
  • 使用连接默认字符集和utf8mb4_0900_ai_ci排序规则(如果连接字符集不是utf8mb4,将失败):

    SELECT 'Müller' COLLATE utf8mb4_0900_ai_ci;
  • 使用连接默认字符集和排序规则:

    SELECT 'Müller';

引导符表明了字符串的字符集,但不影响解析器在字符串内部执行转义处理。总是根据character_set_connection给定的字符集对转义进行解释。

以下示例展示了使用character_set_connection进行转义处理,即使存在引入符。这些示例使用SET NAMES(如第12.4节“连接字符集和排序规则”所讨论的那样),并使用HEX()函数显示结果字符串,以便查看确切的字符串内容。

mysql> SET NAMES latin1;
mysql> SELECT HEX('à\n'), HEX(_sjis'à\n');
+------------+-----------------+
| HEX('à\n')  | HEX(_sjis'à\n')  |
+------------+-----------------+
| E00A       | E00A            |
+------------+-----------------+

在这里,à(十六进制值E0)后跟着\n,换行符的转义序列。使用character_set_connection值为latin1来解释转义序列,生成一个字面上的换行符(十六进制值0A)。即使是第二个字符串,也会发生这种情况。也就是说,《sjis》引入符不影响解析器的转义处理。

mysql> SET NAMES sjis;
mysql> SELECT HEX('à\n'), HEX(_latin1'à\n');
+------------+-------------------+
| HEX('à\n')  | HEX(_latin1'à\n')  |
+------------+-------------------+
| E05C6E     | E05C6E            |
+------------+-------------------+

在这里,character_set_connectionsjis,这是一个字符集,在该字符集中序列 à 后跟随 \(十六进制值 055C)是一个有效的多字节字符。因此,字符串的前两个字节被解释为单个 sjis 字符,\ 不被解释为转义字符。后续的 n(十六进制值 6E)不被解释为转义序列。这也适用于第二个字符串;_latin1 引导符对转义处理没有影响。