本节介绍 MySQL 服务器如何使用字符集构建错误消息。有关错误消息的语言(而非字符集)的信息,请参阅第 12.12 节,“设置错误消息语言”。有关配置错误日志记录的一般信息,请参阅第 7.4.2 节,“错误日志”。
服务器按以下步骤构建错误消息:
消息模板使用 UTF-8 (
utf8mb3
)。消息模板中的参数将替换为适用于特定错误发生的那些值。
如表名或列名之类的标识符在内部使用 UTF-8,因此它们将按原样复制。
字符(非二进制)字符串值将从其字符集转换为 UTF-8。
二进制字符串值将按原样复制,用于范围为
0x20
到0x7E
的字节,并使用\x
十六进制编码用于该范围之外的字节。例如,如果在尝试将0x41CF9F
插入VARBINARY
唯一列时发生重复键错误,则生成的错误消息将使用 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 节,“连接字符集和排序规则”。