10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 本手册下载
PDF (Ltr)- 41.6 mb
PDF (A4)- 41.7 mb
手册页(TGZ)- 262.1 kb
手册页(邮政编码)- 372.1 kb
信息(Gzip)- 4.0 mb
信息(邮政编码)- 4.0 mb
本手册节选

10.3.6字符串文字字符集和排序规则

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

对于简单语句选择“字符串方法定义的连接默认字符集和排序规则character_set_connection而且collation_connection系统变量。

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

(_charset_name]“字符串(核对collation_name

_charset_name表达式的正式名称是an介绍人.它告诉解析器,后面的字符串使用字符集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_connection而且collation_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:

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

在这里,一个(十六进制值E0),其后是\ n,换行符的转义序列。方法解释转义序列character_set_connection的价值latin1生成文本换行符(十六进制值)0一个).这甚至发生在第二弦上。也就是说,_sjis引入器不影响解析器的转义处理。

示例2:

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

在这里,character_set_connectionsjis的序列的字符集一个紧随其后的是(十六进制值05而且5度)是有效的多字节字符。因此,字符串的前两个字节被解释为单个字节sjis字符,不解释为转义字符。以下n(十六进制值6 e)不被解释为转义序列的一部分。即使是第二根弦也是如此;的_latin1引入器不影响转义处理。