## 10.6 错误信息字符集

本节介绍 MySQL 服务器如何使用字符集来构造错误消息。有关错误消息的语言（而不是字符集）的信息，请参阅[第 10.12 节，“设置错误消息语言”](error-message-language.html).有关配置错误日志记录的一般信息，请参阅[第 5.4.2 节，“错误日志”](error-log.html).

-   [错误消息构造的字符集](charset-errors.html#charset-errors-construction)

-   [错误消息处理的字符集](charset-errors.html#charset-errors-disposition)

### 错误消息构造的字符集

服务器构造错误消息如下：

-   消息模板使用 UTF-8 (`utf8mb3`）。

-   消息模板中的参数被替换为适用于特定错误发生的值：

    -   标识符（例如表名或列名）在内部使用 UTF-8，因此它们按原样复制。

    -   字符（非二进制）字符串值从其字符集转换为 UTF-8。

    -   二进制字符串值按原样复制范围内的字节`0x20`到`0x7E`, 并使用`\x`超出该范围的字节的十六进制编码。例如，如果尝试插入时发生重复键错误`0x41CF9F`成一个[`变量`](binary-varbinary.html)唯一列，生成的错误消息使用 UTF-8 和一些字节十六进制编码：

        ```
        Duplicate entry 'A\xCF\x9F' for key 1
        ```

### 错误消息处理的字符集

错误消息一旦构建，就可以由服务器写入错误日志或发送给客户端：

-   如果服务器将错误消息写入错误日志，它将按照构造以 UTF-8 写入，而不转换为另一个字符集。

-   如果服务器将错误消息发送给客户端程序，则服务器将其从 UTF-8 转换为客户端指定的字符集[`字符集结果`](server-system-variables.html#sysvar_character_set_results)系统变量。如果[`字符集结果`](server-system-variables.html#sysvar_character_set_results)有一个值`空值`要么`二进制`，不发生转换。如果变量值为`utf8mb3`要么`utf8mb4`，或者，因为这些字符集具有包含消息构造中使用的所有 UTF-8 字符的曲目。

    如果字符不能在[`字符集结果`](server-system-variables.html#sysvar_character_set_results)，在转换过程中可能会发生一些编码。编码使用 Unicode 代码点值：

    -   基本多语言平面 (BMP) 范围内的字符 (`0x0000`到`0xFFFF`) 是用写的`\*`呸呸呸`*`符号。

    -   BMP 范围之外的字符 (`0x10000`到`0x10FFFF`) 是用写的`\+*`呸呸呸`*`符号。

        客户可以设置[`字符集结果`](server-system-variables.html#sysvar_character_set_results)控制他们接收错误消息的字符集。变量可以直接设置，也可以通过以下方式间接设置[`设置名称`](set-names.html).有关更多信息[`字符集结果`](server-system-variables.html#sysvar_character_set_results)， 看[第 10.4 节，“连接字符集和排序规则”](charset-connection.html).
