mysql存emoji需五层统一为utf8mb4:先确认版本≥5.5.3,再配置my.cnf中[client]、[mysql]、[mysqld]三段,重启后验证六项字符集变量全为utf8mb4,最后手动转换旧库表编码。

MySQL 存不了 Emoji,不是应用层写错了,而是服务端根本没准备好——character_set_server 必须是 utf8mb4,否则所有补救都是临时打补丁。
确认 MySQL 版本和当前字符集状态
低于 5.5.3 的 MySQL 压根不支持 utf8mb4,先查版本再动手:
-
SELECT VERSION();—— 确保 ≥ 5.5.3(5.7/8.0 更稳妥) -
SHOW VARIABLES LIKE 'character_set%';—— 重点看character_set_server和character_set_database是否为utf8mb4 -
SHOW VARIABLES LIKE 'collation%';—— 对应的collation_server应为utf8mb4_unicode_ci或utf8mb4_0900_as_cs(MySQL 8.0+)
如果 character_set_server 还是 utf8 或 latin1,说明服务端配置没生效,别急着改表。
修改 my.cnf/my.ini 强制服务端用 utf8mb4
仅靠连接参数(如 ?charset=utf8mb4)或 SQL 命令(如 SET NAMES)无法改变服务端默认行为。必须编辑配置文件:
- Linux:通常在
/etc/my.cnf或/etc/mysql/my.cnf;宝塔用户直接进【软件商店 → MySQL → 设置 → 配置修改】 - Windows:通常是
C:\ProgramData\MySQL\MySQL Server X.X\my.ini - 在
[mysqld]段下加两行:character-set-server = utf8mb4collation-server = utf8mb4_unicode_ci - 建议同时补上
[client]和[mysql]段的default-character-set = utf8mb4,避免命令行客户端 fallback 到旧编码 - 重启 MySQL 服务后,再次运行
SHOW VARIABLES LIKE 'character_set_server';验证是否返回utf8mb4
跳过这步,后续所有 ALTER TABLE ... CONVERT TO 都可能被新表继承旧默认值,白忙一场。
转换已有库、表、字段的字符集
服务端设对了,但旧库旧表仍是 utf8,插入 Emoji 仍会报 Incorrect string value。必须逐级升级:
- 改库:
ALTER DATABASE your_db_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; - 改表:
ALTER TABLE your_table CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - 单独改字段(尤其带索引的
VARCHAR):
– 先检查索引长度限制:innodb_large_prefix必须为ON,且innodb_file_format = Barracuda
– 若字段是VARCHAR(255),utf8mb4下单列索引上限 767 字节,255×4=1020 > 767,需先缩为VARCHAR(191)再执行MODIFY
注意:CONVERT TO 会重建表,大表慎用;生产环境建议在低峰期执行,并备份。
应用连接层必须同步声明 utf8mb4
即使服务端和表都设对了,应用连上来用错编码,照样存乱码。不同场景要分别处理:
- JDBC:
jdbc:mysql://host:3306/db?characterEncoding=utf8mb4&useUnicode=true - PHP mysqli:
$mysqli->set_charset("utf8mb4")或连接 DSN 中加;charset=utf8mb4 - Python PyMySQL:
charset='utf8mb4'传入connect() - Node.js mysql2:
charset: 'utf8mb4'在 connection config 里
漏掉任意一层,Emoji 就可能在传输途中被截断或转义——比如前端发的是 ❤️,后端收到变成 ,再入库就彻底丢数据。
最常被忽略的是索引长度限制和配置文件中 [client] 段缺失,这两点会让整个流程在最后一步失败。别只盯着 SQL 层,MySQL 的字符集是服务端、连接层、表结构、应用代码四层联动的事,缺一不可。











