mysql启动时默认字符集不是utf8mb4需修改配置文件的[mysqld]段,添加character_set_server=utf8mb4和collation_server=utf8mb4_unicode_ci并重启服务,再验证变量值是否生效。

MySQL 启动时默认字符集不是 utf8mb4 怎么办
MySQL 5.7 及以前版本默认 character_set_server 是 latin1,哪怕客户端连上用了 utf8mb4,建表不显式指定也会继承服务端默认值,后续存中文就出乱码。这不是连接问题,是服务端“出生设定”没改。
实操建议:
- 修改配置文件(通常是
/etc/my.cnf或/etc/mysql/mysql.conf.d/mysqld.cnf),在[mysqld]段落下加两行:[mysqld] character_set_server = utf8mb4 collation_server = utf8mb4_unicode_ci
- 重启 MySQL:执行
sudo systemctl restart mysql(或mysqld,依系统而定) - 验证是否生效:连进 MySQL 后运行
SHOW VARIABLES LIKE 'character_set_server';,输出值必须是utf8mb4
注意:只改 [client] 或 [mysql] 段不够,那些只影响客户端行为,不影响建表默认值。
建表后发现 charset 是 latin1 或 utf8 怎么补救
已存在的表如果字符集不对,ALTER TABLE 能修,但得小心两步走:先改表结构默认字符集,再转已有字段数据。跳过第二步会导致历史数据仍按旧编码解析,表面看着像、实际是乱码。
实操建议:
- 查当前表字符集:
SHOW CREATE TABLE `your_table`;看DEFAULT CHARSET和各VARCHAR字段的CHARACTER SET - 统一转成
utf8mb4(含字段):ALTER TABLE `your_table` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- 如果只想改表默认值、不动字段(极少见需求),用:
ALTER TABLE `your_table` DEFAULT CHARACTER SET utf8mb4;
警告:执行 CONVERT TO 前务必备份;若字段有索引且长度超 191(比如 VARCHAR(255)),需先缩小长度或开启 innodb_large_prefix,否则报错 Specified key was too long。
连接时 client、connection、results 字符集不一致导致乱码
即使服务端和表都设对了,应用连上来用 SET NAMES latin1 或没设任何字符集,MySQL 会按该编码解析请求、再按服务端默认转存——中间一环错,全链路乱。
实操建议:
- 连接建立后立刻执行:
SET NAMES utf8mb4;(等价于分别设character_set_client、character_set_connection、character_set_results) - 在连接字符串里显式声明(以 MySQLi 为例):
mysqli->set_charset("utf8mb4");PDO 则在 DSN 加;charset=utf8mb4 - 检查当前连接实际生效的值:
SHOW VARIABLES LIKE 'character_set%';,重点关注character_set_client、character_set_connection、character_set_results三项是否全为utf8mb4
常见错误现象:SELECT 出来中文显示为问号或 Mojibake(如 “æäºº”),但 HEX() 查值是正常的——说明存储没问题,只是读取时解码错了。
MySQL 8.0+ 默认已是 utf8mb4,为什么还乱码
8.0 默认 character_set_server 确实是 utf8mb4,但默认 collation_server 是 utf8mb4_0900_ai_ci,而很多老应用或 ORM(如旧版 Django、PHP PDO)默认只认 utf8mb4_unicode_ci。连接时若指定 collation 不匹配,可能触发隐式转换失败。
实操建议:
- 确认客户端是否硬编码了 collation,比如 JDBC URL 里写了
collationServer=utf8mb4_unicode_ci,但服务端是0900系列,就会报Unknown collation - 稳妥做法:在
[mysqld]段显式指定兼容的 collation:collation_server = utf8mb4_unicode_ci
- 或者升级客户端驱动,让它支持新 collation(如 MySQL Connector/J 8.0+ 支持
utf8mb4_0900_ai_ci)
容易被忽略的是:MySQL 8.0 的 utf8mb4 默认用 utf8mb4_0900_ai_ci,它和 utf8mb4_unicode_ci 在排序规则细节上有差异,比如对某些 emoji 或德语变音符号的处理——不是乱码,但 ORDER BY 结果可能和预期不一致。










