簡體   English   中英

為什么 --default-character-set=utf8mb4 對客戶端連接沒有影響?

[英]Why does --default-character-set=utf8mb4 have no impact on the client connection?

According tohttps://dev.mysql.com/doc/refman/5.6/en/charset-connection.html , When I connect to a mysql 5.6 server with the mysql 8.0 client using the command:

/usr/bin/mysql -h ${DB_HOST} -u ${DB_USER} -p --default-character-set=utf8mb4

我希望客戶端會建立一個到服務器的 utf8mb4 連接。 但是,連接設置為 latin1:

mysql> SELECT * FROM INFORMATION_SCHEMA.SESSION_VARIABLES WHERE VARIABLE_NAME IN (
 'character_set_client', 'character_set_connection', 'character_set_results', 'collation_connection' ) 
ORDER BY VARIABLE_NAME;
+--------------------------+-------------------+
| VARIABLE_NAME            | VARIABLE_VALUE    |
+--------------------------+-------------------+
| CHARACTER_SET_CLIENT     | latin1            |
| CHARACTER_SET_CONNECTION | latin1            |
| CHARACTER_SET_RESULTS    | latin1            |
| COLLATION_CONNECTION     | latin1_swedish_ci |
+--------------------------+-------------------+

使用另一個字符集,例如: /usr/bin/mysql -h ${DB_HOST} -u ${DB_USER} -p --default-character-set=koi8r將導致客戶端使用提供的字符集進行連接:

mysql> SELECT * FROM INFORMATION_SCHEMA.SESSION_VARIABLES WHERE VARIABLE_NAME IN ( 'character_set_client', 'character_set_connection', 'character_set_results', 'collation_connection' ) ORDER BY VARIABLE_NAME;
+--------------------------+------------------+
| VARIABLE_NAME            | VARIABLE_VALUE   |
+--------------------------+------------------+
| CHARACTER_SET_CLIENT     | koi8r            |
| CHARACTER_SET_CONNECTION | koi8r            |
| CHARACTER_SET_RESULTS    | koi8r            |
| COLLATION_CONNECTION     | koi8r_general_ci |
+--------------------------+------------------+

我可以改變客戶端連接的唯一方法是在連接到服務器后執行charset utf8mb4SET NAMES utf8mb4

mysql> SET NAMES utf8mb4;
Query OK, 0 rows affected (0.01 sec)

mysql> SELECT * FROM INFORMATION_SCHEMA.SESSION_VARIABLES WHERE VARIABLE_NAME IN ( 'character_set_client', 'character_set_connection', 'character_set_results', 'collation_connection' ) ORDER BY VARIABLE_NAME;
+--------------------------+--------------------+
| VARIABLE_NAME            | VARIABLE_VALUE     |
+--------------------------+--------------------+
| CHARACTER_SET_CLIENT     | utf8mb4            |
| CHARACTER_SET_CONNECTION | utf8mb4            |
| CHARACTER_SET_RESULTS    | utf8mb4            |
| COLLATION_CONNECTION     | utf8mb4_general_ci |
+--------------------------+--------------------+

為什么 --default-character-set=utf8mb4 不起作用? 我想使用其他客戶端工具,如 mysqldump 和 mysqlimport,但如果沒有這個標志,我將獲得 latin1 編碼而不是 utf8mb4 編碼。 在這種情況下,更改默認服務器設置不是一種選擇,必須從客戶端完成。

更多信息:我正在嘗試安裝 20.04 ubuntu WSL2,因此沒有可用的 5.6 或 5.7 客戶端。 但是,使用 5.6 或 5.7 windows mysql 客戶端將遵守 --default-character-set=utf8mb4,但 8.0 Z0F4137ED1502B5045D6083AA258B52EZ 客戶端具有與 WSLC2 客戶端相同的行為

此行為在 8.0 文檔中進行了解釋:https://dev.mysql.com/doc/refman/8.0/en/charset-connection.ZFC35FDC70D5FC69D269883A822C7A53

同樣的問題出現在更微妙的上下文中:當客戶端告訴服務器使用服務器識別的字符集,但客戶端上該字符集的默認排序規則在服務器端未知時。 例如,當 MySQL 8.0 客戶端想要使用 utf8mb4 作為客戶端字符集連接到 MySQL 5.7 服務器時,就會發生這種情況。 指定 --default-character-set=utf8mb4 的客戶端能夠連接到服務器。 但是,與前面的示例一樣,服務器回退到其默認字符集和排序規則,而不是客戶端請求的內容:

 mysql> SHOW SESSION VARIABLES LIKE 'character\_set\_%'; +--------------------------+--------+ | Variable_name | Value | +--------------------------+--------+ | character_set_client | latin1 | | character_set_connection | latin1 |... |character_set_results | latin1 |... +--------------------------+--------+ mysql> SHOW SESSION VARIABLES LIKE 'collation_connection'; +----------------------+-------------------+ | Variable_name | Value | +----------------------+-------------------+ | collation_connection | latin1_swedish_ci | +----------------------+-------------------+

為什么會出現這種情況? 畢竟 utf8mb4 是 8.0 客戶端和 5.7 服務端都知道的,所以他們都認了。 要理解這種行為,有必要了解當客戶端告訴服務器它要使用哪個字符集時,它實際上是告訴服務器該字符集的默認排序規則。 因此,上述行為的發生是由於多種因素的組合:

  • utf8mb4 的默認排序規則在 MySQL 5.7 和 8.0 之間有所不同(utf8mb4_general_ci 用於 5.7,utf8mb4_0900_ai_ci 用於 8.0)。

  • 當8.0客戶端請求一個utf8mb4的字符集時,它發送給服務器的是默認的8.0 utf8mb4排序規則; 即 utf8mb4_0900_ai_ci。

  • utf8mb4_0900_ai_ci 僅在 MySQL 8.0 中實現,因此 5.7 服務器無法識別它。

  • 由於 5.7 服務器無法識別 utf8mb4_0900_ai_ci,因此無法滿足客戶端字符集請求,並回退到其默認字符集和排序規則(latin1 和 latin1_swedish_ci)。

在這種情況下,客戶端仍然可以通過在連接后發出 SET NAMES 'utf8mb4' 語句來使用 utf8mb4。 生成的排序規則是 5.7 默認的 utf8mb4 排序規則; 即utf8mb4_general_ci。 如果客戶端還想要一個 utf8mb4_0900_ai_ci 的排序規則,它無法實現,因為服務器無法識別該排序規則。 客戶端必須願意使用不同的 utf8mb4 排序規則,或者從 MySQL 8.0 或更高版本連接到服務器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM