10.5 配置应用程序字符集和排序规则

对于使用默认 MySQL 字符集和排序规则(latin1latin1_swedish_ci)存储数据的应用程序,不需要特殊配置。如果应用程序要求使用其他字符集或排序规则存储数据,则可以通过以下几种方式配置字符集信息:

  • 指定每个数据库的字符设置。例如,使用一个数据库的应用程序可能使用默认值latin1,而使用另一个数据库的应用程序可能使用sjis

  • 在服务器启动时指定字符设置。这导致服务器将给定的设置用于所有未进行其他安排的应用程序。

  • 如果您从源代码构建 MySQL,请在配置时指定字符设置。这使服务器将给定的设置用作所有应用程序的默认设置,而不必在服务器启动时指定它们。

当不同的应用程序需要不同的字符设置时,每个数据库技术都提供了很大的灵 Active。如果大多数或所有应用程序使用相同的字符集,则在服务器启动或配置时指定字符设置可能是最方便的。

对于每个数据库或服务器启动技术,这些设置控制数据存储的字符集。应用程序还必须告诉服务器要用于 Client 机/服务器通信的字符集,如以下说明中所述。

此处显示的示例假定在特定上下文中使用utf8字符集和utf8_general_ci排序规则来替代latin1latin1_swedish_ci的默认设置。

  • 指定每个数据库的字符设置. 要创建数据库,使其 table 将使用给定的默认字符集和排序规则进行数据存储,请使用CREATE DATABASE语句,如下所示:
CREATE DATABASE mydb
  CHARACTER SET utf8
  COLLATE utf8_general_ci;

默认情况下,数据库中创建的 table 将对任何字符列使用utf8utf8_general_ci

使用数据库的应用程序还应该在每次连接时配置它们与服务器的连接。这可以通过在连接后执行SET NAMES 'utf8'语句来完成。无论连接方法(mysqlClient 端,PHP 脚本等)如何,都可以使用该语句。

在某些情况下,可以将连接配置为以其他方式使用所需的字符集。例如,要使用mysql进行连接,可以指定--default-character-set=utf8命令行选项以实现与SET NAMES 'utf8'相同的效果。

有关配置 Client 端连接的更多信息,请参见第 10.4 节“连接字符集和排序规则”

Note

如果您使用ALTER DATABASE更改数据库默认字符集或排序规则,则必须删除并重新创建数据库中使用这些默认值的现有存储例程,以便它们使用新的默认值。 (在存储的例程中,如果未明确指定字符集或排序规则,则具有字符数据类型的变量将使用数据库默认值.请参见第 13.1.16 节“ CREATE PROCEDURE 和 CREATE FUNCTION 语句”。)

  • 在服务器启动时指定字符设置. 要在服务器启动时选择字符集和排序规则,请使用--character-set-server--collation-server选项。例如,要在选项文件中指定选项,请包括以下几行:
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci

这些设置适用于整个服务器,并作为任何应用程序创建的数据库以及在这些数据库中创建的 table 的默认设置。

如前所述,应用程序仍然需要在连接后使用SET NAMES或等效名称来配置其连接。您可能会想使用--init_connect =“设置名称'utf8'”选项启动服务器,以使对每个连接的 Client 端自动执行SET NAMES。但是,这可能会产生不一致的结果,因为没有为SUPER特权的用户执行init_connect值。

  • 在 MySQL 配置时指定字符设置. 如果从源配置和构建 MySQL,则要选择字符集和排序规则,请使用DEFAULT_CHARSETDEFAULT_COLLATION CMake 选项:
cmake . -DDEFAULT_CHARSET=utf8 \
  -DDEFAULT_COLLATION=utf8_general_ci

生成的服务器使用utf8utf8_general_ci作为数据库和 table 以及 Client 端连接的默认值。在服务器启动时,不必使用--character-set-server--collation-server来指定那些默认值。连接到服务器后,应用程序也不必使用SET NAMES或等效的配置来配置其连接。

无论如何配置 MySQL 字符集以供应用程序使用,您还必须考虑那些应用程序在其中执行的环境。例如,如果将使用从编辑器中创建的文件中提取的 UTF-8 文本发送语句,则应在环境语言环境设置为 UTF-8 的情况下编辑该文件,以便文件编码正确且 os 会正确处理它。如果您在终端窗口中使用mysqlClient 端,则必须将该窗口配置为使用 UTF-8,否则字符可能无法正确显示。对于在 Web 环境中执行的脚本,该脚本必须正确处理字符编码以使其与 MySQL 服务器交互,并且必须生成正确指示编码的页面,以便浏览器知道如何显示页面的内容。例如,您可以在<head>元素中包含此<meta>标签:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />