Mysql 如何更改default collation_connection setting

張衝andy發表於2023-09-15

客戶端連線到伺服器時,如何更改預設的“ 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


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31383567/viewspace-2983558/,如需轉載,請註明出處,否則將追究法律責任。

相關文章