mysql 8.0 默认字符集虽为utf8mb4,但必须同时配置character-set-server、collation-server和init_connect='set names utf8mb4',并配合[client]与[mysql]段default-character-set=utf8mb4,才能确保服务端、客户端、连接会话、表字段全链路生效,否则仍会出现乱码或连接失败。

MySQL 8.0 默认字符集已经是 utf8mb4,但仅配置 character-set-server 不足以保证连接、客户端、表、列全链路生效;必须配合 init_connect 和客户端段配置,否则 Navicat、Python pymysql、Java JDBC 等仍可能报乱码或连接失败(如错误 2059)。
必须同时设置的三个关键配置项
只改 character-set-server=utf8mb4 是不够的。MySQL 8.0 启动后,新连接默认使用服务端字符集,但客户端握手时若未显式声明,仍可能回退到旧行为(尤其搭配 caching_sha2_password 认证插件时)。
-
character-set-server=utf8mb4:设服务端默认字符集(影响新建库/表的默认值) -
collation-server=utf8mb4_unicode_ci或utf8mb4_0900_ai_ci:必须与字符集匹配,推荐用utf8mb4_0900_ai_ci(MySQL 8.0 默认校对规则,区分大小写和重音更精准) -
init_connect='SET NAMES utf8mb4':让每个普通用户连接成功后自动执行该语句,确保会话级字符集立即生效(注意:对root或具有SUPER权限的用户不生效,需单独处理)
客户端段也要配,否则命令行 mysql 仍乱码
仅配 [mysqld] 段,mysql 命令行工具本身不会自动用 utf8mb4 连接——它读的是 [client] 和 [mysql] 段。
- 在
[client]下加:default-character-set=utf8mb4(影响所有客户端工具,如mysql,mysqldump) - 在
[mysql]下加:default-character-set=utf8mb4(专用于mysql命令行客户端) - Windows 用户注意:
my.ini中路径含空格或反斜杠需用正斜杠或双反斜杠,例如basedir=D:/mysql-8.0.46
验证是否真正生效,别信配置文件写了就算
重启 MySQL 后,登录执行以下三句,缺一不可:
SHOW VARIABLES LIKE 'character_set%'; SHOW VARIABLES LIKE 'collation%'; SELECT CHARSET(USER()), COLLATION(USER());
重点检查:
-
character_set_server和collation_server是否为utf8mb4/utf8mb4_0900_ai_ci -
character_set_client、character_set_connection、character_set_results是否全为utf8mb4(靠init_connect和客户端段共同保障) - 如果其中任一值是
latin1或utf8(非utf8mb4),说明某处配置未加载或被覆盖
容易忽略的坑:配置文件没被读到,或被多个路径覆盖
MySQL 会按固定顺序搜索配置文件,后加载的会覆盖前面的。Windows 下常见误配点:
- MSI 安装版默认读取
C:\ProgramData\MySQL\MySQL Server 8.0\my.ini(ProgramData是隐藏目录) - 手动解压 ZIP 版必须用
--defaults-file显式指定,否则可能完全不读你的my.ini - 运行
mysqld --help --verbose | grep "Default options"(Linux/macOS)或mysqld --help --verbose(Windows,查输出中 “Default options are read from” 行)确认实际加载路径 - 修改后务必重启服务(
systemctl restart mysqld或net stop MySQL80 && net start MySQL80),仅 reload 不生效
最麻烦的情况是:你改了 /etc/my.cnf,但 MySQL 实际加载了 /etc/mysql/my.cnf —— 这种“配置写了却无效”的问题,90% 出在路径没找对。











