客户端连接到服务器时,如何更改默认的“collation_connection”设置,这会影响文字和函数。
按照设计,collation_connection设置为每个客户端指定的字符集的默认排序规则。例如,如果服务器版本为8.0,并且客户端指定了utf8mb4,则在建立连接后,collation_connection将为utf8mb4_0900_ai_ci。客户端只能指定字符集,不能在连接时指定排序规则。如果您想更改缺省的collation_connection,您需要发出SET NAMES命令,如下所示
mysql> SET NAMES utf8mb4 COLLATE utf8mb4_ja_0900_as_cs_ks;
通常,应用程序只需要使用一种归类。如果应用程序需要一个collation_connection,如utf8mb4_ja_0900_as_cs_ks,但当前的collation_connection设置为utf8mb4_0900_ai_ci,则可能会得到错误的结果。这是一个非常糟糕的情况。因此,您可能希望让服务器为每个连接设置所需的排序规则。
为此,有以下方法:
1.在每次连接时发出 SET NAMES
如上所述,可以使用SET NAMES命令更改collation_connection。您可以在每次连接时使用初始化连接选项。虽然init_connect选项不影响拥有SUPER或CONNECTION_ADMIN权限的用户,但是该选项对于应用程序用户来说已经足够了。在这种情况下,您可以在my.cnf中设置选项,如下所示:
[mysqld]
init_connect=SET NAMES utf8mb4 COLLATE utf8mb4_ja_0900_as_cs_ks
您需要重新启动MySQL服务器来应用my.cnf中的配置更改设置全局命令:
mysql> SET GLOBAL init_connect='SET NAMES utf8mb4 COLLATE utf8mb4_ja_0900_as_cs_ks';
您还可以在MySQL 8.0上使用SET PERSIST命令来使配置更改持久化。
有关init_connect选项的更多信息,请参见以下手册: https://dev.mysql.com/doc/refman/en/server-system-variables.html#sysvar_init_connect
2.使用 using skip_character_set_client_handshake 选项应用全局设置
当未指定skip _ character _ set _ client _ handshake选项时,归类设置为每个客户端指定的字符集的默认归类。当指定skip _ character _ set _ client _ handshake选项时,将忽略客户端字符集,并在连接时应用服务器设置。由于skip _ character _ set _ client _ handshake选项是只读选项,您需要将它添加到my.cnf中,并重新启动服务器以启用该选项,如下所示:
[mysqld]
skip_character_set_client_handshake
当 skip_character_set_client_handshake 生效时,从全局系统变量中复制 character_set_client, character_set_results, and collation_connection 。有关skip_character_set_client_handshake选项的更多详细信息,请参见参考手册: https://dev.mysql.com/doc/refman/en/server-options.html#option_mysqld_character-set-client-handshake
您可以设置全局级别的collation_connection系统变量,如下所示;请注意,您必须首先更改字符集:
mysql> SET GLOBAL character_set_connection=utf8mb4;
mysql> SET GLOBAL collation_connection=utf8mb4_ja_0900_as_cs_ks;
但是,不能在my.cnf中设置collation_connection,因为它不是启动选项。所以,你需要在服务器以某种方式重启时设置它。
在MySQL 8.0系列上,可以使用设置持续命令如下:
mysql> SET PERSIST character_set_connection=utf8mb4;
mysql> SET PERSIST collation_connection=utf8mb4_ja_0900_as_cs_ks;
SET PERSIST使全局系统变量持久化,而不是用于启动选项。虽然collation_connection不是启动选项,而是具有全局级别范围的系统变量,但是可以使用SET PERSIST。
如果您使用的是MySQL 5.7或更早版本,init_file选项是一个不错的选择。它指定了一个包含服务器启动时执行的命令的文件。您可以指定初始化文件my.cnf中的选项如下:
[mysqld]
init_file=/path/to/init_file.sql
文件的内容可以像下面这样:
SET GLOBAL character_set_connection=utf8mb4;
SET GLOBAL collation_connection=utf8mb4_ja_0900_as_cs_ks;
总结: 保证服务端与客户端使用统一的数据库字符集与编码,可以在 my.cnf / mysql 8 SET PERSIST / init_file 添加如下配置。
#my.cnf参数配置
character_set_server = utf8mb4
collation-server = utf8mb4_general_ci
init_connect='SET NAMES utf8mb4 COLLATE utf8mb4_general_ci'
skip-character-set-client-handshake