12.5 配置应用程序字符集和排序规则
对于使用默认 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
对于任何字符列。使用该数据库的应用程序也应该在每次连接服务器时配置连接。可以通过执行mysql 客户端、PHP 脚本等,使用
SET NAMES 'latin1'
语句。该语句可以在任何连接方法下使用(包括mysql 客户端、PHP 脚本等)。在某些情况下,也可以通过其他方式来配置连接使用所需的字符集。例如,使用mysql 客户端,可以指定
--default-character-set=latin1
命令行选项,以实现与SET NAMES 'latin1'
相同的效果。关于配置客户端连接的更多信息,请参见第12.4节,“连接字符集和排序规则”。
Note如果使用
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
自动执行对每个连接。但是,这可能会导致不一致的结果,因为init_connect
值不执行对拥有CONNECTION_ADMIN
(或已弃用的SUPER
权限)的用户。 -
在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文本从文件中发送语句,那么你应该在编辑器中将locale设置为UTF-8,以便文件编码正确,操作系统也能正确处理。如果你使用mysql客户端从终端窗口中,那么窗口必须配置为UTF-8,否则可能无法正确显示字符。对于在Web环境执行的脚本,它必须正确处理与MySQL服务器的交互,并生成页面以便浏览器知道如何显示内容。例如,你可以在元素中包含以下<meta>
标签:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />