MySQL 字符集:错误消息字符集

来自Wikioe
跳到导航 跳到搜索


用于构造错误消息的字符集

服务器构造错误消息,如下所示:

  1. 消息模板使用 UTF-8(utf8mb3)。
  2. 消息模板中的参数将替换为适用于特定错误发生的值:
    1. 表名或列名之类的标识符在内部使用 UTF-8,因此可以照原样复制。
    2. 字符(非二进制)字符串值从其字符集转换为 UTF-8.
    3. 对于 0x20 到 0x7E 范围内的字节,按原样复制二进制字符串值,对于超出该范围的字节,使用 \x 十六进制编码。例如,如果尝试将0x41CF9F插入到“VARBINARY”唯一列中时发生重复键错误,则产生的错误消息将使用 UTF-8,某些字节以十六进制编码:
    Duplicate entry 'A\xC3\x9F' for key 1
    

用于处置错误消息的字符集

一旦构造了错误消息,服务器就可以将其写入错误日志或发送给 Client 端:

  1. 如果服务器将错误消息写入错误日志,则将其构造为 UTF-8 格式,而不转换为另一个字符集。
  2. 如果服务器将错误消息发送到 Client 端程序,则服务器会将错误消息从 UTF-8 转换为“character_set_results”系统变量指定的字符集。【如果“character_set_results”的值为“NULL”或“binary”,则不会进行任何转换。如果变量值为“utf8mb3”或“utf8mb4”,则不会进行任何转换,因为这些字符集的库包含了消息构造中使用的所有 UTF-8 字符。】
  3. 如果不能用“character_set_results”表示字符,则在转换过程中可能会发生一些编码。编码使用 Unicode 码点:
    1. 基本多语言平面(BMP)范围(0x0000到0xFFFF)中的字符使用\nnnn 表示法编写。
    2. BMP 范围之外的字符(0x10000到0x10FFFF)使用\+nnnnnn 表示法书写。

Client 端可以设置“character_set_results”来控制接收错误消息的字符集。该变量可以直接设置,也可以通过诸如“SET NAMES”间接设置。

设置编写错误消息的语言

默认情况下,mysqld 会以英语生成错误消息,但可以改用其他几种语言来显示它们:捷克语,丹麦语,荷兰语,爱沙尼亚语,法语,德语,希腊语,匈牙利语,意大利语,日语,韩语,挪威语,挪威语-ny ,波兰语,葡萄牙语,罗马尼亚语,俄语,斯洛伐克语,西班牙语或瑞典语。这适用于服务器写入错误日志并发送给 Client 端的消息。


服务器使用以下规则搜索错误消息文件:

  1. 它在由两个系统变量值lc_messages_dirlc_messages构造的目录中查找文件,后者被转换为语言名称。假设您使用以下命令启动服务器:
    mysqld --lc_messages_dir=/usr/share/mysql --lc_messages=fr_FR
    
    在这种情况下,mysqld 将语言环境“fr_FR”映射到语言“french”并在“/usr/share/mysql/french”目录中查找错误文件。
    • 默认情况下,语言文件位于 MySQL 基本目录下的“share/mysql/LANGUAGE”目录中。【5.7.33 在“share”目录中】
  2. 如果在如上所述的目录中找不到消息文件,则服务器将忽略“lc_messages”值,而仅使用“lc_messages_dir”值作为查找位置。
    • “lc_messages_dir”系统变量只能在服务器启动时设置,并且在运行时仅具有全局只读值。
    • “lc_messages”可以在服务器启动时设置,并且具有可以在运行时修改的全局值和会话值。因此,可以在服务器运行时更改错误消息语言,并且每个 Client 端可以通过将其会话“lc_messages”值设置为所需的语言环境名称来拥有自己的错误消息语言
      例如,如果服务器使用“fr_FR”语言环境来显示错误消息,则 Client 端可以执行以下语句来接收英语的错误消息:
      SET lc_messages = 'en_US';