mysql 5.5.3及以上版本支持utf8mb4;需通过select version()确认,低于该版本必须升级;配置需同步修改[client]、[mysql]、[mysqld]三段并重启服务;已有库表须手动执行alter database和alter table convert to utf8mb4。

确认 MySQL 版本是否支持 utf8mb4
utf8mb4 是从 MySQL 5.5.3 开始正式支持的,低于这个版本(比如 5.1 或早期 5.5)直接改配置也没用。运行 SELECT VERSION(); 确认当前版本;若结果是 5.5.2 或更低,必须先升级 MySQL。
修改 my.cnf 配置文件的三处关键位置
只改 [mysqld] 段不够,客户端和连接层也得对齐,否则 character_set_client 和 character_set_results 仍可能是 utf8,导致插入/查询时二次转码出错。
在 /etc/mysql/my.cnf(Linux)或 my.ini(Windows)中,确保以下三段都存在且正确:
[client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4 [mysqld] character-set-client-handshake = FALSE character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci init_connect = 'SET NAMES utf8mb4'
注意:character-set-client-handshake = FALSE 这行很关键,它强制忽略客户端声明的字符集(比如 JDBC 里带的 characterEncoding=utf8),统一走服务端设定。
重启后验证变量是否全部生效
重启 MySQL:service mysql restart(或 systemctl restart mysqld)。然后登录执行:
SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
重点检查这五个值必须是 utf8mb4:
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
character_set_clientcharacter_set_connectioncharacter_set_databasecharacter_set_resultscharacter_set_server
只要其中任一个还是 utf8 或 latin1,说明配置没生效或被覆盖(比如 Docker 启动参数、启动脚本里的 --character-set-server 冲突)。
已有库表必须手动转换,配置不会自动迁移
改完配置并重启,只影响新创建的数据库/表/字段。老表的字符集、排序规则、字段定义全都不变,emoji 插入依然会截断或报错 Incorrect string value。
按顺序执行:
- 改库:
ALTER DATABASE your_db_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; - 改表:
ALTER TABLE your_table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - 如果某字段是
TEXT或VARCHAR且之前设了CHARACTER SET utf8,单独改字段更稳妥:ALTER TABLE your_table_name MODIFY column_name VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
特别注意:CONVERT TO 会重建整张表,大表执行期间锁表,生产环境务必选低峰期操作,并提前备份。
最容易被忽略的是:即使服务端、驱动、连接串全设对了,只要表结构里某个 VARCHAR 字段的字符集仍是 utf8,存 emoji 就一定会失败——MySQL 校验的是字段级字符集,不是连接层。










