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

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

简单地说`选择'*`一串`*'`，字符串具有连接默认字符集和[`字符集连接`](server-system-variables.html#sysvar_character_set_connection)和[`校对连接`](server-system-variables.html#sysvar_collation_connection)系统变量。

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

[](<>)[](<>)

```
[_charset_name]'string' [COLLATE collation_name]
```

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

例如：

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

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

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

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

-   如果*`_charset_名称`*已指定，但`整理`未指定，字符集*`charset_名称`*并使用其默认排序规则。要查看每个字符集的默认排序规则，请使用[`显示字符集`](show-character-set.html)声明或查询`信息模式` [`字符集`](information-schema-character-sets-table.html)桌子

-   如果*`_charset_名称`*未指定，但`整理*`排序规则名称`*`指定的连接默认字符集[`字符集连接`](server-system-variables.html#sysvar_character_set_connection)系统变量和排序规则*`排序规则名称`*都用过了。*`排序规则名称`*必须是连接默认字符集允许的排序规则。

-   否则（两者都不是*`_charset_名称`*也没有`整理*`排序规则名称`*`的连接默认字符集和排序规则[`字符集连接`](server-system-variables.html#sysvar_character_set_connection)和[`校对连接`](server-system-variables.html#sysvar_collation_connection)使用系统变量。

    例如：

-   带有`拉丁语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';
    ```

    介绍人指示以下字符串的字符集，但不会更改解析器在字符串中执行转义处理的方式。转义总是由解析器根据[`字符集连接`](server-system-variables.html#sysvar_character_set_connection).

    以下示例显示转义处理使用[`字符集连接`](server-system-variables.html#sysvar_character_set_connection)即使有介绍人在场。这些例子使用[`定名`](set-names.html)（哪些变化[`字符集连接`](server-system-variables.html#sysvar_character_set_connection)，如中所述[第10.4节，“连接字符集和排序规则”](charset-connection.html))，并使用[`十六进制（）`](string-functions.html#function_hex)函数，以便可以看到确切的字符串内容。

    例1：


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

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

例2：

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

在这里[`字符集连接`](server-system-variables.html#sysvar_character_set_connection)是`sjis`，一种字符集，其中`à`然后`\`（十六进制值）`05`和`5C`)是有效的多字节字符。因此，字符串的前两个字节被解释为单个字节`sjis`性格，以及`\`不会被解释为转义字符。下面`n`（十六进制值）`6E`)不会被解释为转义序列的一部分。即使是第二个字符串也是如此；这个`_拉丁语1`介绍人不影响转义处理。
