必须显式指定 --default-character-set=utf8mb4,否则 emoji 会变成问号或报错;因为 mysqldump 默认以 utf8(utf8mb3)连接,不支持 4 字节 emoji,即使库表字段已设 utf8mb4,客户端连接层不匹配仍会导致截断或报错。

必须显式指定 --default-character-set=utf8mb4,否则 emoji 会变成问号或报错。
为什么 mysqldump 默认会损坏 emoji 数据
MySQL 5.5.3+ 支持 utf8mb4 编码存储 emoji,但 mysqldump 默认使用 utf8(即 utf8mb3)连接,它最多只支持 3 字节字符,而 emoji 是 4 字节的。这会导致导出时字符被截断、替换为 ?,或在导入时报 Incorrect string value 错误。
即使数据库、表、字段都设为 utf8mb4,mysqldump 的客户端连接层不匹配,照样出问题。
- 检查当前连接编码:
mysql -u root -e "SELECT @@character_set_client, @@collation_connection;" - 默认情况下,它通常返回
utf8和utf8_general_ci,这就是隐患源头 -
mysqldump不读取目标库的字符集配置,它只按自己的连接参数行事
正确导出命令:强制 utf8mb4 连接 + 兼容性参数
最简可靠写法:
mysqldump --default-character-set=utf8mb4 -u root -p database_name > backup.sql
关键点说明:
-
--default-character-set=utf8mb4必须放在-u之前,否则会被忽略(mysqldump解析顺序敏感) - 加上
--skip-set-charset可避免导出文件里生成SET NAMES utf8这类错误指令(它会覆盖你后续导入时的编码设置) - 如需兼容老版本 MySQL 导入,可加
--compatible=mysql40,但会禁用部分utf8mb4相关语法,不推荐;优先保证源端和目标端都支持utf8mb4 - 如果导出含视图或存储过程,建议额外加
--hex-blob防止二进制内容被意外转义
导入时同样要指定 utf8mb4,且注意 MySQL 客户端配置
仅导出正确还不够,导入环节也得匹配:
- 用
mysql命令导入时,同样要加--default-character-set=utf8mb4:mysql --default-character-set=utf8mb4 -u root -p database_name - 如果使用
source命令在 MySQL 客户端内执行,先运行:SET NAMES utf8mb4;,再source backup.sql - 检查 MySQL 客户端配置文件(如
~/.my.cnf),确保没有全局default-character-set=utf8覆盖你的命令行参数 - 导入后验证:
SELECT LENGTH(column_name), CHAR_LENGTH(column_name) FROM table_name WHERE column_name LIKE '%?%';—— 若前者是 4,后者是 1,说明 emoji 存储正常
容易被忽略的底层依赖:服务端 collation 和 client 端一致
光改 mysqldump 参数不够,还得确认服务端配合:
- MySQL 服务端需启用
utf8mb4支持:检查my.cnf中是否有collation-server = utf8mb4_unicode_ci和character-set-server = utf8mb4 - 重启 MySQL 后,执行
SHOW VARIABLES LIKE 'character\_set%';,确认character_set_client、character_set_connection、character_set_database全部为utf8mb4 - 如果用 Docker 或云数据库,有些托管服务默认不启用
utf8mb4作为 server 默认值,需手动修改参数组或启动配置
漏掉服务端任一环节,mysqldump 就算加了参数,也可能因握手阶段协商失败而回退到 utf8。











