对于使用默认 MySQL 字符集和排序规则(utf8mb4
、utf8mb4_0900_ai_ci
)存储数据的应用程序,不需要进行特殊配置。如果应用程序需要使用其他字符集或排序规则存储数据,则可以通过以下几种方式配置字符集信息:
为每个数据库指定字符设置。例如,使用一个数据库的应用程序可以使用默认的
utf8mb4
,而使用另一个数据库的应用程序可以使用sjis
。在服务器启动时指定字符设置。这将导致服务器对所有未进行其他安排的应用程序使用给定的设置。
如果从源代码构建 MySQL,则在配置时指定字符设置。这将导致服务器将给定的设置用作所有应用程序的默认设置,而无需在服务器启动时指定它们。
当不同的应用程序需要不同的字符设置时,按数据库技术提供了很大的灵活性。如果大多数或所有应用程序使用相同的字符集,则在服务器启动或配置时指定字符设置可能最方便。
对于按数据库或服务器启动技术,这些设置控制数据存储的字符集。应用程序还必须告诉服务器在客户端/服务器通信中使用哪个字符集,如下面的说明中所述。
此处显示的示例假定在特定上下文中使用 latin1
字符集和 latin1_swedish_ci
排序规则,作为 utf8mb4
和 utf8mb4_0900_ai_ci
默认值的替代方案。
为每个数据库指定字符设置。 要创建一个数据库,使其表使用给定的默认字符集和排序规则来存储数据,请使用如下所示的
CREATE DATABASE
语句:CREATE DATABASE mydb CHARACTER SET latin1 COLLATE latin1_swedish_ci;
默认情况下,在数据库中创建的表对任何字符列都使用
latin1
和latin1_swedish_ci
。使用该数据库的应用程序还应在每次连接时配置其与服务器的连接。这可以通过在连接后执行
SET NAMES 'latin1'
语句来完成。无论连接方法如何(mysql 客户端、PHP 脚本等),都可以使用该语句。在某些情况下,可以通过其他方式配置连接以使用所需的字符集。例如,要使用 mysql 进行连接,您可以指定
--default-character-set=latin1
命令行选项,以实现与SET NAMES 'latin1'
相同的效果。有关配置客户端连接的更多信息,请参阅 第 12.4 节,“连接字符集和排序规则”。
注意如果使用
ALTER DATABASE
更改数据库默认字符集或排序规则,则数据库中使用这些默认值的现有存储例程必须删除并重新创建,以便它们使用新的默认值。(在存储例程中,如果未显式指定字符集或排序规则,则具有字符数据类型的变量将使用数据库默认值。请参阅 第 15.1.17 节,“CREATE PROCEDURE 和 CREATE FUNCTION 语句”。)在服务器启动时指定字符设置。 要在服务器启动时选择字符集和排序规则,请使用
--character-set-server
和--collation-server
选项。例如,要在选项文件中指定选项,请包含以下行:[mysqld] character-set-server=latin1 collation-server=latin1_swedish_ci
这些设置适用于整个服务器,并作为任何应用程序创建的数据库以及在这些数据库中创建的表的默认设置。
应用程序仍然需要在连接后使用
SET NAMES
或等效语句配置其连接,如前所述。您可能会尝试使用--init_connect="SET NAMES 'latin1'"
选项启动服务器,以便在每个连接的客户端自动执行SET NAMES
。但是,这可能会产生不一致的结果,因为对于具有CONNECTION_ADMIN
权限(或已弃用的SUPER
权限)的用户,不会执行init_connect
值。在 MySQL 配置时指定字符设置。 如果要从源代码配置和构建 MySQL,则在配置时选择字符集和排序规则,请使用
DEFAULT_CHARSET
和DEFAULT_COLLATION
CMake 选项:cmake . -DDEFAULT_CHARSET=latin1 \ -DDEFAULT_COLLATION=latin1_swedish_ci
生成的服务器将使用
latin1
和latin1_swedish_ci
作为数据库、表和客户端连接的默认设置。无需使用--character-set-server
和--collation-server
在服务器启动时指定这些默认值。应用程序也无需在连接到服务器后使用SET NAMES
或等效语句配置其连接。
无论您如何配置 MySQL 字符集以供应用程序使用,您还必须考虑这些应用程序执行的环境。例如,如果您打算使用从编辑器中创建的文件中获取的 UTF-8 文本发送语句,则应在将环境的区域设置设置为 UTF-8 的情况下编辑该文件,以便文件编码正确并且操作系统可以正确处理它。如果您在终端窗口中使用 mysql 客户端,则必须将窗口配置为使用 UTF-8,否则字符可能无法正确显示。对于在 Web 环境中执行的脚本,该脚本必须正确处理与其与 MySQL 服务器交互的字符编码,并且它必须生成正确指示编码的页面,以便浏览器知道如何显示页面的内容。例如,您可以在 <head>
元素中包含以下 <meta>
标记
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />