本节描述 MySQL 服务器如何使用字符集来构建错误消息。有关错误消息语言(而不是字符集)的信息,请参阅 第 12.12 节,“设置错误消息语言”。有关配置错误日志记录的常规信息,请参阅 第 7.4.2 节,“错误日志”。
服务器按照以下方式构建错误消息:
-
消息模板使用 UTF-8 (
utf8mb3
)。 -
消息模板中的参数将被替换为特定错误发生时的值:
-
标识符,如表或列名,在内部使用 UTF-8,因此它们将被原样复制。
-
字符(非二进制)字符串值将从其字符集转换为 UTF-8。
-
二进制字符串值将被复制为范围
0x20
到0x7E
的字节,并使用\x
十六进制编码对范围外的字节进行编码。例如,如果尝试将0x41CF9F
插入到唯一列中时发生重复键错误,结果错误消息将使用 UTF-8,其中一些字节将被十六进制编码:Duplicate entry 'A\xCF\x9F' for key 1
-
一旦构建完成,错误消息可以由服务器写入错误日志或发送到客户端:
-
如果服务器将错误消息写入错误日志,它将以构建时的 UTF-8 编写,不进行其他字符集的转换。
-
如果服务器将错误消息发送到客户端程序,服务器将其从UTF-8转换为由
character_set_results
系统变量指定的字符集。如果character_set_results
的值为NULL
或binary
,则不进行转换。如果变量值为utf8mb3
或utf8mb4
,也不进行转换,因为这些字符集的 репертуар包括所有用于消息构造的UTF-8字符。如果字符不能在
character_set_results
中表示,一些编码可能会在转换期间发生。编码使用 Unicode 代码点值:-
基本多语言平面(BMP)范围内的字符(
0x0000
到0xFFFF
)使用\
表示法。nnnn
-
BMP 范围外的字符(
0x10000
到0x10FFFF
)使用\+
表示法。nnnnnn
客户端可以设置
character_set_results
以控制它们接收错误消息的字符集。变量可以直接设置,也可以通过诸如SET NAMES
等间接设置方式。有关character_set_results
的更多信息,请参阅第 12.4 节,“连接字符集和排序”。 -