10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 本手册下载 本手册摘录

10.3.6字符串字面量字符集和排序

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

对于简单语句选择“字符串类定义的连接默认字符集和排序规则character_set_connectioncollation_connection系统变量。

字符串字面量可以有一个可选的字符集导入器和核对子句,将其指定为使用特定字符集和排序规则的字符串:

(_charset_name]“字符串(核对collation_name

_charset_name表达式的正式名称是介绍人.它告诉解析器,后面的字符串使用字符集charset_name导入器不会将字符串更改为导入器字符集将()要做的事情。它不会改变字符串值,尽管可能会发生填充。介绍人只是一个信号。看到第10.3.8节,“字符集介绍”

例子:

选择“abc”;选择_latin1'abc ';选择_binary 'abc ';SELECT _utf8mb4'abc' COLLATE utf8mb4_danish_ci;

字符集引入器和核对子句是根据标准SQL规范实现的。

MySQL以如下方式确定一个字符串的字符集和排序:

  • 如果两个_charset_name核对collation_name是否指定,字符集charset_name和排序collation_name使用。collation_name必须是允许的排序charset_name

  • 如果_charset_name但指定核对不指定,字符集charset_name并且使用了它的默认排序。要查看每个字符集的默认排序规则,请使用显示字符集语句或查询INFORMATION_SCHEMACHARACTER_SETS表格

  • 如果_charset_name没有具体说明,但是核对collation_name指定,连接的默认字符集由character_set_connection系统变量和排序collation_name使用。collation_name必须是连接默认字符集允许的排序规则。

  • 否则(既不_charset_name也不核对collation_name),连接的默认字符集和排序规则由character_set_connectioncollation_connection使用系统变量。

例子:

  • 带有的非二进制字符串latin1字符集和latin1_german1_ci排序:

    SELECT _latin1'Müller' COLLATE latin1_german1_ci;
  • 带有的非二进制字符串utf8mb4字符集及其默认排序规则(即,utf8mb4_0900_ai_ci):

    选择_utf8mb4'Muller ';
  • 一个带有二进制字符集及其默认排序规则(即,二进制):

    选择_binary 'Muller ';
  • 具有连接默认字符集和的非二进制字符串utf8mb4_0900_ai_ci排序规则(如果连接字符集不是,则失败utf8mb4):

    SELECT ` Müller ` COLLATE utf8mb4_0900_ai_ci;
  • 带有连接默认字符集和排序规则的字符串:

    选择“穆勒”;

引入器指示以下字符串的字符集,但不改变解析器在字符串中执行转义处理的方式。所给出的字符集总是由解析器解释转义character_set_connection

下面的示例显示使用character_set_connection即使有介绍人在场。使用的例子组名称(更改character_set_connection,如在第10.4节,“连接字符集和排序规则”),并使用十六进制()函数,以便可以看到确切的字符串内容。

示例1:

mysql> SET NAMES latin1;mysql> SELECT HEX('à\n'), HEX(_sjis'à\n');+------------+-----------------+ | 十六进制(“\ n”)|十六进制(_sjis \ n ') | +------------+-----------------+ | E00A | E00A  | +------------+-----------------+

在这里,一个(十六进制值E0)之后是\ n,换行符的转义序列。类解释转义序列character_set_connection的价值latin1产生一个字面值换行符(十六进制值0A).这甚至发生在第二个字符串。也就是说,_sjis介绍人不影响解析器的转义处理。

示例2:

mysql> SET NAMES sjis;mysql> SELECT HEX('à\n'), HEX(_latin1'à\n');+------------+-------------------+ | 十六进制(“\ n”)|十六进制(_latin1'a \ n ') | +------------+-------------------+ | E05C6E | E05C6E  | +------------+-------------------+

在这里,character_set_connectionsjis,一种字符集,其中的序列一个紧随其后的是(十六进制值055度)为有效的多字节字符。因此,字符串的前两个字节被解释为单个字节sjis字符,不会被解释为转义字符。以下n(十六进制值6 e)不会被解释为转义序列的一部分。这对第二个字符串也是正确的;的_latin1介绍人不影响逃逸处理。