[英]mysqlbinlog: unknown variable '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 utf8mb4
或SET 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.