# 10.3.6字符串文字字符集和排序

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

简单地说选择'*一串*',字符串具有连接默认字符集和字符集连接校对连接系统变量。

字符串文字可以有可选的字符集引入器和整理子句,将其指定为使用特定字符集和排序规则的字符串:

[_charset_name]'string' [COLLATE collation_name]

这个_*charset_名称*这个表达形式上被称为介绍人它告诉解析器,“后面的字符串使用字符集*charset_名称*“介绍人不会像这样将字符串更改为介绍人字符集CONVERT()可以。虽然可能会出现填充,但它不会更改字符串值。介绍人只是一个信号。看见第10.3.8节,“字符集介绍人”.

例如:

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

角色集介绍人和整理子句是根据标准SQL规范实现的。

MySQL通过以下方式确定字符串文本的字符集和排序规则:

  • 如果两者都有*_charset_名称整理*排序规则名称*指定的字符集charset_名称整理排序规则名称都用过了。排序规则名称必须是允许的排序规则charset_名称*.

  • 如果*_charset_名称已指定,但整理未指定,字符集charset_名称*并使用其默认排序规则。要查看每个字符集的默认排序规则,请使用显示字符集声明或查询信息模式 字符集桌子

  • 如果*_charset_名称未指定,但整理*排序规则名称*指定的连接默认字符集字符集连接系统变量和排序规则排序规则名称都用过了。排序规则名称*必须是连接默认字符集允许的排序规则。

  • 否则(两者都不是*_charset_名称*也没有整理*排序规则名称*的连接默认字符集和排序规则字符集连接校对连接使用系统变量。

    例如:

  • 带有拉丁语1字符集和拉丁语整理:

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

    SELECT _utf8mb4'Müller';
    
  • 带有二进制的字符集及其默认排序规则(即,二进制的):

    SELECT _binary'Müller';
    
  • 具有连接默认字符集和utf8mb4_0900_ai_ci排序规则(如果未指定连接字符集,则失败)utf8mb4):

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

    SELECT 'Müller';
    

    介绍人指示以下字符串的字符集,但不会更改解析器在字符串中执行转义处理的方式。转义总是由解析器根据字符集连接.

    以下示例显示转义处理使用字符集连接即使有介绍人在场。这些例子使用定名(哪些变化字符集连接,如中所述第10.4节,“连接字符集和排序规则”),并使用十六进制()函数,以便可以看到确切的字符串内容。

    例1:

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

在这里à(十六进制值)E0)然后是\n,换行符的转义序列。使用字符集连接价值拉丁语1生成文字换行符(十六进制值0A).即使是第二个字符串也会发生这种情况。就是_sjis介绍人不会影响解析器的转义处理。

例2:

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

在这里字符集连接sjis,一种字符集,其中à然后\(十六进制值)055C)是有效的多字节字符。因此,字符串的前两个字节被解释为单个字节sjis性格,以及\不会被解释为转义字符。下面n(十六进制值)6E)不会被解释为转义序列的一部分。即使是第二个字符串也是如此;这个_拉丁语1介绍人不影响转义处理。