MySQL 服务器在编译时有一个默认的字符集(character set)和校对序(collation)。如果你想要更改这些默认值,可以在启动服务器时使用 --character-set-server
和 --collation-server
选项。这些选项允许你指定服务器将用于新创建数据库、表和列的默认字符集和校对序。
当你为 MySQL 服务器设置默认字符集时,也需要选择一个与该字符集兼容的默认校对序。
为了确定每个字符集可用的校对序,你可以使用 SHOW COLLATION
语句或查询 INFORMATION_SCHEMA.COLLATIONS
表。
如果你尝试使用未编译进 MySQL 二进制文件中的字符集,可能会遇到下面这些问题:
- 如果您的程序使用错误的路径来确定字符集的存储位置(通常是mysql安装目录下的share/mysql/charsets或share/charset目录),则可以在运行程序时使用--character sets-dir选项来解决此问题。例如,要指定MySQL客户端程序要使用的目录,请将其列在选项文件的[client]组中。这里给出的示例分别显示了Unix或Windows的设置:
[client]
character-sets-dir=/usr/local/mysql/share/mysql/charsets
[client]
character-sets-dir="C:/Program Files/MySQL/MySQL Server 8.0/share/charsets"
- 如果你尝试使用的字符集是一个复杂的字符集,它可能不支持动态加载,这意味着你需要重新编译 MySQL 服务器或客户端程序以包含对这个字符集的支持。
对于 Unicode 字符集,你可以使用 LDML符号来定义新的校对序,而无需重新编译 MySQL。
- 如果你的字符集是动态字符集(即可以在运行时加载的字符集),但你没有该字符集的配置文件,你需要从新的 MySQL 发行版中安装该字符集的配置文件。这通常意味着你需要从 MySQL 官方网站下载最新的 MySQL 版本,并从中提取字符集配置文件。
-
如果你的字符集索引文件(Index.xml)不包含特定字符集的名称,你的程序会显示一个错误消息:
Character set 'charset_name' is not a compiled character set and is not
specified in the '/usr/share/mysql/charsets/Index.xml' file
要解决此问题,应该获取一个新的索引文件,或者手动将任何丢失的字符集的名称添加到当前文件中。
可以强制客户端程序使用特定的字符集,如下所示:
[client]
default-character-set=charset_name
在大多数情况下,确保 character_set_system
、character_set_server
和 character_set_client
一致并不是必需的。然而,当这些字符集设置不一致时,并且你手动输入字符(作为数据库对象标识符、列值或两者兼有),这些字符可能在客户端的输出中显示不正确,或者输出本身的格式可能不正确。
在这种情况下,使用
--default-character-set=system_character_set启动mysql客户端——也就是说,将客户端字符集设置为与系统字符集匹配——应该可以解决这个问题。