10.6 错误消息字符集
本节介绍 MySQL 服务器如何使用字符集构造错误消息。有关错误消息的语言(而不是字符集)的信息,请参见第 10.12 节“设置错误消息语言”。有关配置错误日志记录的一般信息,请参见第 5.4.2 节“错误日志”。
用于错误消息构造的字符集
服务器构造错误消息,如下所示:
-
消息模板使用 UTF-8(
utf8mb3
)。 -
消息模板中的参数将替换为适用于特定错误发生的值:
-
table 或列名之类的标识符在内部使用 UTF-8,因此可以照原样复制。
-
字符(非二进制)字符串值从其字符集转换为 UTF-8.
-
对于
0x20
到0x7E
范围内的字节,按原样复制二进制字符串值,对于超出该范围的字节,使用\x
十六进制编码。例如,如果尝试将0x41CF9F
插入到VARBINARY唯一列中时发生重复键错误,则产生的错误消息将使用 UTF-8,某些字节以十六进制编码:
-
Duplicate entry 'A\xC3\x9F' for key 1
错误消息处置的字符集
一旦构造了错误消息,服务器就可以将其写入错误日志或发送给 Client 端:
-
如果服务器将错误消息写入错误日志,则将其构造为 UTF-8 格式,而不转换为另一个字符集。
-
如果服务器将错误消息发送到 Client 端程序,则服务器会将错误消息从 UTF-8 转换为character_set_results系统变量指定的字符集。如果character_set_results的值为
NULL
或binary
,则不会进行任何转换。如果变量值为utf8mb3
或utf8mb4
,则不会进行任何转换,因为这些字符集的库包含了消息构造中使用的所有 UTF-8 字符。
如果不能用character_set_resultstable 示字符,则在转换过程中可能会发生一些编码。编码使用 Unicode 代码点值:
-
基本多语言平面(BMP)范围(
0x0000
到0xFFFF
)中的字符使用\nnnn
table 示法编写。- BMP 范围之外的字符(
0x10000
到0x10FFFF
)使用\+nnnnnn
table 示法书写。
- BMP 范围之外的字符(
Client 端可以设置character_set_results来控制接收错误消息的字符集。该变量可以直接设置,也可以通过诸如SET NAMES间接设置。有关character_set_results的更多信息,请参见第 10.4 节“连接字符集和排序规则”。