MySQL导出含Emoji的CSV乱码,根本原因是连接层未全链路启用utf8mb4编码,需确保客户端、驱动、导出命令均显式指定utf8mb4,而非仅表字符集设为utf8mb4_unicode_ci。
MySQL 导出含 Emoji 的 CSV 时乱码?确认 utf8mb4 连接层全链路生效
emoji 存不进去或导出来是问号、方块,90% 是连接层没用 utf8mb4,不是表字符集设对了就行。表用 utf8mb4_unicode_ci 只是基础,mysql 客户端、连接驱动、导出命令三者都得显式指定编码。
-
mysqldump必须加--default-character-set=utf8mb4,否则默认走utf8(即utf8mb3),会静默截断四字节 Emoji - 如果用
SELECT ... INTO OUTFILE,语句前必须先执行SET NAMES utf8mb4,否则导出文件用的是 session 默认编码 - Python 的
pymysql或mysql-connector-python需在connect()里传charset='utf8mb4',光设collation不行 - Navicat / DBeaver 等 GUI 工具要单独检查「连接属性→高级→字符集」是否为
utf8mb4,不能只信状态栏显示的“UTF-8”
用 mysqldump 导出带 Emoji 的 CSV:绕过 SQL 层直接生成文本
mysqldump 默认导 SQL,不适合直接当 CSV 用;但加几个参数就能输出制表符分隔、带引号、换行转义的类 CSV 格式,且保留 Emoji 完整性。
- 命令模板:
mysqldump --default-character-set=utf8mb4 -t -T /tmp/ --fields-enclosed-by='"' --fields-terminated-by='\t' --lines-terminated-by='\n' db_name table_name - 注意
-T要求 MySQL 有FILE权限,且目标路径是 MySQL 服务端可写目录(不是你本地机器) - 导出的是
\t分隔,Excel 打开需用「数据→从文本导入」并指定分隔符;若坚持用逗号,可用sed替换,但要注意字段内本身含逗号或换行的情况 - 导出文件本身无 BOM,UTF-8 编码,Windows 记事本可能误判为 ANSI,建议用 VS Code 或 Notepad++ 查看验证
Python pandas + pymysql 导出 Emoji 安全 CSV:避开 to_csv 的默认编码陷阱
pandas 的 to_csv 默认用 utf-8 编码,看似没问题,但若数据从 MySQL 读出时已被截断(比如连接没设 utf8mb4),再怎么改导出编码都救不回。
- 读取阶段最关键:用
pymysql.connect(charset='utf8mb4'),然后pd.read_sql(..., con=conn),确保 DataFrame 里字符串对象原生含四字节码点 - 导出时显式指定
encoding='utf-8-sig'(加 BOM 防 Excel 乱码)或'utf-8'(更通用),别依赖默认值 - 如果字段含换行符(\n)或双引号,
to_csv默认会加引号、转义,无需额外处理;但 Excel 对 \r\n 换行兼容更好,可加line_terminator='\r\n' - 避免用
str.replace('?', 'smile')这类手动替换——Emoji 是 Unicode 字符,不是字符串模式,替换会破坏原始码点
Excel 打开含 Emoji 的 CSV 显示异常?问题大概率不在导出环节
导出文件用 VS Code 看是正常的 Emoji,但 Excel 里变小方框或问号,基本可锁定是 Excel 自身限制或打开方式错误。
- 不要双击 CSV 文件——这会让 Excel 用系统默认编码(通常是 GBK)读取 UTF-8 文件,必乱码;必须用「Excel → 数据 → 从文本/CSV → 浏览选中文件 → 编码选 UTF-8」
- Excel for Windows 旧版本(2016 及以前)对 Emoji 渲染支持弱,即使编码正确也可能只显示占位符,这不是数据损坏,换 WPS 或在线版 Google Sheets 就能正常看
- Mac 版 Excel 对 UTF-8 和 Emoji 兼容性好很多,但若字体不支持(比如用 Courier New),仍会显示为空心方块;可临时切换成
Apple Color Emoji或Segoe UI Emoji - 导出后用
file -i filename.csv确认 MIME 类型是text/plain; charset=utf-8,排除文件头被污染
utf8。多查一次 SHOW VARIABLES LIKE 'character_set%',比重导十遍都管用。











