Mysql 如何更改default collation_connection setting

2023年 9月 15日 112.8k 0

客户端连接到服务器时,如何更改默认的“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

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论