导出CSV中文乱码需逐层排查编码:MySQL连接层用SET NAMES utf8mb4或--default-character-set=utf8mb4;pandas用encoding="utf-8-sig"加BOM;Excel需手动选UTF-8编码导入;检查max_allowed_packet防截断。
导出 CSV 时中文变问号或方块?先查 mysql 连接层编码
mysql 客户端连接默认可能用 latin1,哪怕表和字段是 utf8mb4,一导出就乱码。关键不是文件保存格式,而是「连接时声明的字符集」。
实操建议:
- 导出前执行
SET NAMES utf8mb4;(或SET CHARACTER SET utf8mb4;),确保会话层编码对齐 - 用
mysqldump时必须加参数:--default-character-set=utf8mb4,漏掉这个参数,mysqldump仍按默认连接编码读数据 - 如果用 Navicat / DBeaver 等 GUI 工具,得在「连接属性 → 高级 → 字符集」里手动指定
utf8mb4,不能只依赖数据库服务端设置
Python pandas.to_csv() 导出中文乱码?别只盯 encoding
Windows 记事本默认用 GBK 打开无 BOM 的 UTF-8 文件,显示为乱码——但这不是 pandas 写错了,是打开方式问题。
实操建议:
- 写 CSV 时强制加 BOM:
df.to_csv("out.csv", encoding="utf-8-sig"),这样 Windows 记事本能自动识别 - 若要兼容 Excel(尤其旧版),避免用
utf-8直接写,utf-8-sig是更稳妥的选择 - 别用
encoding="gbk"应急——它可能把某些生僻字转成?,且跨平台不可靠
Excel 打开 UTF-8 CSV 仍是乱码?问题在打开动作本身
直接双击打开 CSV,Excel 默认用系统区域编码(如简体中文 Windows 是 GBK)解析,根本不会检测 UTF-8 BOM 或内容。
实操建议:
- 在 Excel 中:数据 → 自获取外部数据 → 从文本/CSV → 选文件 → 在导入向导第 2 步手动选「65001: Unicode (UTF-8)」
- 或者用记事本先打开 CSV,另存为「UTF-8-BOM」格式再用 Excel 打开
- 如果用的是 Excel for Mac,它对 UTF-8 支持更好,但依然不认无 BOM 的 UTF-8,BOM 很关键
导出后文件大小异常小,中文全消失?检查 SELECT 是否被截断
有些 ORM(如 Django 的 values_list())或 MySQL 配置(max_allowed_packet)太小,导致含中文的字段被静默截断成空字符串,导出后看似“乱码”,其实是空值。
实操建议:
- 导出前先在命令行跑
SELECT LENGTH(col), col FROM table LIMIT 1;,确认字段实际长度和内容是否正常 - 查 MySQL 当前
max_allowed_packet值:SHOW VARIABLES LIKE 'max_allowed_packet';,低于 16M 可能影响大字段导出 - 用
mysql --default-character-set=utf8mb4 -e "SELECT ..."直接输出到文件,绕过中间程序,快速定位是哪一层出的问题
真正卡住人的,往往不是编码设错,而是某一层(连接、导出命令、打开工具)悄悄用了别的编码,还不出错提示。挨个验证比猜快得多。











