mysql导出csv需显式指定character set utf8mb4和enclosed by '"'防乱码截断;导入时用set子句清洗空值、临时关闭严格模式,并校验换行符与字段一致性。

MySQL 导出 CSV 时字段被截断或乱码怎么办
导出 CSV 最常见的坑是 SELECT ... INTO OUTFILE 默认用系统编码(如 Latin1),而中文字段直接变问号或乱码;另一类是字段含换行、逗号、引号时没加包裹,导致 Excel 或后续导入解析错位。
必须显式指定字符集和字段分隔规则:
SELECT id, name, content INTO OUTFILE '/tmp/data.csv' CHARACTER SET utf8mb4 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' FROM my_table;
注意:OUTFILE 路径是 MySQL 服务端路径(不是客户端本地),且需有写入权限;若无权限,改用 mysqldump --tab 或客户端导出(如 MySQL Shell 的 \sql + \out)。
CSV 导入到目标 MySQL 时提示 “Incorrect integer value” 或日期格式错误
这是字段类型不匹配的典型表现:源库某列为 INT,但 CSV 中对应列含空字符串 ""、"NULL" 或全角空格;日期字段如 "2024-03-15 14:22:07" 在目标库时区/SQL mode 下被拒。
导入前务必做两件事:
- 用
LOAD DATA INFILE时加SET子句做字段清洗,例如:LOAD DATA INFILE '/tmp/data.csv' INTO TABLE my_table CHARACTER SET utf8mb4 FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' (@id, @name, @content) SET id = NULLIF(@id, ''), name = TRIM(@name), content = TRIM(@content);
- 临时关闭严格模式:
SET sql_mode = '';(仅会话级,导入完恢复) - 确认目标表字段长度、精度是否足够——比如源
VARCHAR(255),目标却是VARCHAR(50),截断不报错但数据丢失
如何在 CSV 中转环节自动校验字段一致性
纯靠人工核对 CSV 行数、首尾字段容易漏。推荐用轻量脚本做三件事:字段名比对、空值率统计、主键重复检查。
使用 qbo-mileage CLI 及用户凭证,从 Airtable、Outlook 或 Google Calendar 记录生成 QuickBooks Online 里程 CSV 文件。
以 Python 为例(无需数据库连接):
import csv
with open('data.csv', encoding='utf8') as f:
rdr = csv.DictReader(f)
# 检查字段顺序与目标表定义是否一致
expected_cols = ['id', 'name', 'created_at']
if rdr.fieldnames != expected_cols:
print(f"字段顺序不匹配:期望 {expected_cols},实际 {rdr.fieldnames}")
# 统计每列空值率
for col in expected_cols:
null_cnt = sum(1 for row in rdr if not row.get(col) or row[col].strip() == '')
# 注意:rdr 已遍历过一次,此处需重开文件
更稳妥的做法是用 head -n 1 data.csv | tr ',' '\n' | wc -l 确认列数,再用 awk -F',' '{print NF}' data.csv | sort -u 检查每行字段数是否恒定——不一致说明某行含未转义换行符。
Windows 和 Linux 之间传输 CSV 后换行符导致导入失败
Windows 默认用 \r\n,Linux 用 \n。LOAD DATA INFILE 在 Linux MySQL 上若遇到 \r\n,可能把最后一列末尾的 \r 当作内容,导致类型转换失败(如 INT 字段值变成 "123\r")。
解决方式分两步:
- 导出时统一用
LINES TERMINATED BY '\n'(非默认的系统换行) - 传输后用
dos2unix /tmp/data.csv或sed -i 's/\r$//' /tmp/data.csv清理 - 导入命令中显式指定:
LINES TERMINATED BY '\n',避免依赖 MySQL 自动识别
跨平台迁移最麻烦的往往不是数据本身,而是这些看似“无关紧要”的文本细节——一个没处理的 \r、一个没包裹的双引号、一个没设的 CHARACTER SET,都可能让整批导入静默失败或数据错位。










