![](/img/trans.png)
[英]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.