必须显式指定 CHARACTER SET utf8mb4,否则默认按 latin1 写入导致中文乱码;导出后 Excel 需通过「数据→从文本/CSV」并选 65001 编码打开,或另存为 UTF-8-BOM 格式。

SELECT INTO OUTFILE 必须显式指定 CHARACTER SET utf8mb4
直接用 SELECT * INTO OUTFILE 导出中文,几乎必然乱码——因为 MySQL 默认按会话的 character_set_client 编码写入文件,而该值常为 latin1,哪怕表是 utf8mb4 也无济于事。
关键不是“文件存成什么格式”,而是「MySQL 服务端写入时用哪个字符集编码字节」。必须强制声明:
-
CHARACTER SET utf8mb4是硬性要求,不能省略;utf8(即utf8mb3)不支持 emoji 和部分生僻汉字,会静默丢字 - 字段含换行、逗号或双引号时,
ENCLOSED BY '"'必须加上,否则 Excel 或 Pythonpandas.read_csv()解析必错位 - 路径必须是 MySQL 服务端可写的绝对路径(如
/var/lib/mysql-files/),且用户需有FILE权限;本地路径(如C:\data\)直接报错
正确写法示例:
SELECT id, name, remark INTO OUTFILE '/var/lib/mysql-files/users.csv' CHARACTER SET utf8mb4 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' FROM users;
导出后 Excel 打开仍是乱码?问题不在 MySQL,而在 Excel 的打开方式
即使 INTO OUTFILE 正确指定了 CHARACTER SET utf8mb4,用 Windows Excel 双击打开 CSV,99% 还是乱码。这不是导出错了,是 Excel 根本没读 BOM,也懒得检测 UTF-8 编码。
实操上只有两种可靠方式:
- 在 Excel 中:「数据」→「从文本/CSV」→ 选中文件 → 第二步手动将「文件原始格式」设为
65001: Unicode (UTF-8) - 用记事本或 Notepad++ 打开 CSV → 「另存为」→ 编码选
UTF-8-BOM(注意带 BOM)→ 再用 Excel 双击打开,就能识别
别信“改系统区域设置”或“Excel 默认编码设 UTF-8”这种方案——Excel for Windows 没这选项,纯属误导。
为什么 mysqldump --tab 不推荐用于中文导出
mysqldump --tab 看似方便,但它底层仍调用 SELECT INTO OUTFILE,且**不支持 CHARACTER SET 子句**。它完全依赖当前连接的字符集,而默认连接极大概率是 latin1。
从 CSV 数据集生成图数据库加载器和三元组映射。将表格 CSV 数据转换为图数据库可直接使用的节点、边和三元组。
常见错误现象:
- 导出文件大小正常,但中文全变成问号或空格
- 执行
SHOW VARIABLES LIKE 'character_set%';发现character_set_client是latin1,但忘了加--default-character-set=utf8mb4 - 即使加了参数,若连接已建立再执行
SET NAMES utf8mb4,mysqldump也不会重连,无效
结论:要导出中文 CSV,优先手写 SELECT ... INTO OUTFILE + 显式 CHARACTER SET;mysqldump --tab 仅适合英文或数字型数据。
INTO OUTFILE 导出 NULL 值默认写成 \N,下游解析容易误判
INTO OUTFILE 对 NULL 的处理是写入字符串 \N(两个字符:反斜杠 + N),不是空字符串,也不是 NULL 字面量。这在用 LOAD DATA INFILE 导回时没问题,但给 Python 或 Excel 用就容易当成普通文本。
如果下游需要空字符串代替 \N,必须在 SELECT 中显式转换:
-
IFNULL(name, '') AS name—— 转成空字符串 -
COALESCE(phone, 'N/A') AS phone—— 转成自定义占位符 - 避免用
CONCAT('', col)处理可能为 NULL 的字段,它会把NULL变成空字符串,但掩盖了原始空值语义
更隐蔽的坑:某些字段类型(如 TIMESTAMP)在 INTO OUTFILE 中会自动补零或转时区,若需原始值,务必用 DATE_FORMAT(col, '%Y-%m-%d %H:%i:%s') 显式格式化。










