这是客户端驱动版本过低导致无法识别MySQL 8.0的字符集ID(如255对应utf8mb4),根本解决方法是升级pymysql≥1.1.0或手动注入映射pymysql.charset_by_id[255] = 'utf8mb4',并显式设置charset='utf8mb4'。

MySQL 8.0 连接报 Server sent charset unknown 是什么问题?
这是客户端(比如 Python 的 pymysql、mysqlclient,或 Java 的 mysql-connector-java)在握手阶段读取服务器返回的字符集 ID 时失败导致的。MySQL 8.0 默认使用 utf8mb4_0900_ai_ci 排序规则,其对应的字符集 ID 在旧版客户端驱动中未被识别,于是返回 unknown —— 不是配置错误,而是兼容性断层。
Python 中用 pymysql 连接时怎么修?
根本原因是 pymysql 低版本(≤1.0.2)缺少对 MySQL 8.0 新字符集 ID 的映射。解决方式不是改配置,而是升级或打补丁:
- 升级到
pymysql>=1.1.0(推荐):pip install --upgrade pymysql
- 若无法升级,临时补救:在连接前手动注入字符集映射
import pymysql<br>pymysql.charset_by_id[255] = 'utf8mb4'
(255 是 MySQL 8.0 常用的 utf8mb4 字符集 ID) - 避免使用
charset='utf8'参数——它实际对应 MySQL 的utf8(即utf8mb3),和服务器默认不匹配;应显式设为charset='utf8mb4'
Java 项目用 mysql-connector-java 怎么处理?
老版本(如 5.1.x、6.0.x)同样不认识 MySQL 8.0 的字符集 ID。关键不是加参数,而是换驱动:
- 必须升级到
mysql-connector-java >= 8.0.12(8.0.x 系列)或8.1.x最新版 - 连接 URL 中加上
?serverTimezone=UTC&characterEncoding=utf8mb4只能缓解部分乱码,不能解决 handshake 阶段的 charset unknown 报错 - 如果用的是 Spring Boot,默认依赖可能仍是 5.1.x,需在
pom.xml中强制覆盖:<dependency><br> <groupId>mysql</groupId><br> <artifactId>mysql-connector-java</artifactId><br> <version>8.0.33</version><br></dependency>
为什么改 MySQL 的 my.cnf 通常没用?
很多人试图通过修改 collation-server 或 character-set-server 来降级兼容性,但问题不在服务端配置——MySQL 8.0 即使设成 utf8mb4_general_ci,仍会发送新字符集 ID。真正卡住的是客户端解析逻辑:
-
init_connect或SET NAMES对 handshake 阶段无效 -
skip-character-set-client-handshake是危险选项,可能导致后续 SQL 执行时字符集混乱,不建议启用 - 唯一有效的服务端配合动作:确认
information_schema.character_sets中 ID 255 确实对应utf8mb4(MySQL 8.0 默认如此,一般不用动)
这个错误本质是客户端驱动太老,不是你的代码写错了,也不是 MySQL 配得不对。盯住驱动版本,比调参数更直接有效。


















