最可靠方式是直接修改my.cnf的[mysqld]段,添加character-set-server=utf8mb4和collation-server=utf8mb4_unicode_ci,并重启MySQL服务;仅重载配置无效,且必须确保配置位于[mysqld]区块下,否则不生效。

直接改my.cnf的[mysqld]段是最可靠方式
MySQL服务启动时只读一次配置文件,SET GLOBAL character_set_server = 'utf8mb4'这类运行时修改完全无效,重启后就丢。必须编辑my.cnf(Linux)或my.ini(Windows),且只能加在[mysqld]区块下——加在[client]或[mysql]里对服务端无影响。
务必写这两行:
character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci
不能写utf8:MySQL 的 utf8 是历史遗留别名,实际等价于 utf8mb3,不支持 emoji 和部分生僻汉字;写错会导致后续所有新建库表默认用错编码。
常见错误位置:
-
/etc/my.cnf或/etc/mysql/my.cnf(多数 Linux 发行版) -
C:\ProgramData\MySQL\MySQL Server X.X\my.ini(Windows 默认路径,注意是 ProgramData 而非 Program Files) - 宝塔面板用户请进【软件商店】→ MySQL → 【设置】→ 【配置修改】,直接编辑,别手动找文件
改完必须重启 MySQL 服务,不能只重载配置
配置文件生效依赖 mysqld 进程重新初始化字符集上下文。仅执行systemctl reload mysqld或宝塔点【重载配置】,character_set_server变量仍维持旧值。
验证是否真正生效:
mysql -u root -p -e "SHOW VARIABLES LIKE 'character_set_server';"
输出必须是:
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
+----------------------+---------+ | Variable_name | Value | +----------------------+---------+ | character_set_server | utf8mb4 | +----------------------+---------+
如果还是latin1或utf8,说明:
- 配置文件没写对区块(比如误写在
[client]下) - MySQL 读的是另一个配置文件(用
mysqld --verbose --help | grep "Default options"确认加载路径) - Docker 环境未挂载自定义配置,只设了
MYSQL_INITDB_CHARSET=utf8mb4这类环境变量——这不管用
collation-server不是可选项,漏掉会出排序异常
字符集和校对规则必须配套。只设character-set-server = utf8mb4而没设collation-server,MySQL 会 fallback 到utf8mb4_general_ci(MySQL 5.7)或utf8mb4_0900_ai_ci(MySQL 8.0+),但行为不一致:
- 中文排序可能错位(如“张”排在“李”前)
-
GROUP BY、ORDER BY结果不稳定 - 唯一索引对大小写/重音敏感判断失准
推荐统一用utf8mb4_unicode_ci(兼容性好)或utf8mb4_0900_as_cs(MySQL 8.0+,区分大小写和重音),避免混用。别信“不设也行”的经验——线上查过SHOW VARIABLES LIKE '%collation%'就知道。
已有数据不会自动转码,配置只是兜底新建对象
改完character-set-server并重启,只影响之后新建的数据库、表、临时表。原来用latin1或utf8建的库表,字段里存的还是乱码字节,SELECT 出来仍是问号或截断。
必须手动转换,且顺序严格:
- 先跑
ALTER DATABASE db_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; - 再对每张表执行
ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - 最后单独检查
VARCHAR(255)这类字段:utf8mb4 下单字符最多占 4 字节,InnoDB 行长度限制仍按 65535 字节算,超限会报Row size too large
跳过CONVERT TO只用MODIFY COLUMN改字符集,已有数据不会重解码——旧乱码还是乱码,这点最容易被忽略。

















