MySQL 字符集问题

2022-03-11 11:50:28 +08:00
 PaperKite

同一个 MySQL ,my.cnf 中配置了

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci

执行以下 SQL

show variables like '%char%';
show variables like 'collation%';

MySQL cli 查询结果

Variable_name Value
character_set_client utf8
character_set_connection utf8
character_set_database utf8
character_set_filesystem binary
character_set_results utf8
character_set_server utf8
character_set_system utf8
character_sets_dir /usr/share/mysql/charsets/

Variable_name Value
collation_connection utf8_general_ci
collation_database utf8_general_ci
collation_server utf8_general_ci

navicat 、navicat 命令行、datagrip 结果

Variable_name Value
character_set_client utf8mb4
character_set_connection utf8mb4
character_set_database utf8
character_set_filesystem binary
character_set_results utf8mb4
character_set_server utf8
character_set_system utf8
character_sets_dir /usr/local/mysql/share/charsets/

Variable_name Value
collation_connection utf8mb4_general_ci
collation_database utf8_general_ci
collation_server utf8_general_ci

为何结果不同

2220 次点击
所在节点    MySQL
13 条回复
Aluhao
2022-03-11 11:52:42 +08:00
建议直接使用:utf8mb4
PaperKite
2022-03-11 11:55:05 +08:00
@Aluhao 主要是想问为何两个地方结果不一样
LeslieWongH
2022-03-11 12:13:14 +08:00
katsusan
2022-03-11 12:54:36 +08:00
navicat 连接 mysql 成功后会执行几条命令: set names xxx; show variables like 'lower_case_%'; ...

如果连接信息里编码选的是 auto, 就会执行 set names utf8mb4.可以在你的命令行下试试看, 跟 navicat 一样的结果.
PaperKite
2022-03-11 13:10:12 +08:00
@katsusan #4 感谢。命令行执行了 set names utf8mb4 之后,确实和 navicat 一样的结果了,连接信息里编码也确实选的是 auto ; auto 切换成其他就跟最开始的命令行结果一致了。另外想问一下( navicat 连接 mysql 成功后会执行几条命令: set names xxx; show variables like 'lower_case_%'; ...)这个是如何了解到的
comlewin
2022-03-11 13:13:22 +08:00
这可能就叫经验
PaperKite
2022-03-11 13:16:05 +08:00
@comlewin 可能这就是大佬吧👍
chengyiqun
2022-03-11 14:08:35 +08:00
@PaperKite #7 你可以启动 navicat 后按 ctrl+H 查看命令行历史, navicat 作为 GUI 工具, 是记录了命令行交互历史记录哒
PaperKite
2022-03-11 14:10:26 +08:00
@chengyiqun 你说的是工具选项卡中的历史日志吗 我在里面没找到#4 说的内容
liprais
2022-03-11 14:11:15 +08:00
client 字符集是 client 设置的,你不设置当然就 follow server 的
chengyiqun
2022-03-11 14:12:45 +08:00
@PaperKite #9 不知道, 可能是 navicat 版本不一样吧, 我司的分布式数据库就是和新版 navicat 兼容性不好, 所以我至今还在用 navicat11
katsusan
2022-03-11 14:22:01 +08:00
@PaperKite #5
> 想问一下( navicat 连接 mysql 成功后会执行几条命令: set names xxx; show variables like 'lower_case_%'; ...)这个是如何了解到的

mysql 的 client 向 server 发送 query command 时用的是 text protocol, 在 unencrypted connection(no SSL)下用 tcpdump 抓包就能看到了. 协议在 https://dev.mysql.com/doc/internals/en/com-query.html.
PaperKite
2022-03-11 15:13:12 +08:00
@katsusan 感谢 抓包看到了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/839638

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX