MySQL导入CSV后缺失约1.3万条记录,求排查方案
可能的错误原因分析
1. 字段解析参数配置错误
- 包围符设置错误:你使用了
ENCLOSED BY '"',但"是HTML转义后的双引号,CSV文件中实际的字段包围符应为原生双引号"。MySQL会将"当作字面量字符串处理,无法正确识别字段内的逗号分隔,导致包含逗号的字段被错误拆分,整行解析失败后被跳过。建议修改为ENCLOSED BY '"'。 - 转义符设置错误:
ESCAPED BY '\b'指定退格符作为转义符,但标准CSV通常用反斜杠\完成转义。如果字段中存在需要转义的字符(比如包围符本身),退格符无法完成转义逻辑,会导致解析异常,该行直接被丢弃。建议改为ESCAPED BY '\\'。 - 换行符不匹配:
LINES TERMINATED BY '\r\n'对应Windows格式换行,但如果你的CSV文件是Unix/Linux格式(仅\n)或旧Mac格式(仅\r),MySQL无法正确识别行边界,会出现多行合并解析或单行拆分的情况,最终导致部分记录丢失。可以尝试改为LINES TERMINATED BY '\n',或用文件编辑工具(如Notepad++)查看文件实际换行符格式。
2. 数据类型与表约束冲突
- 数据类型不兼容:如果CSV中字段内容与表中对应字段的数据类型不匹配(比如CSV是字符串但表字段为INT,或者数值超出字段取值范围),在非严格SQL模式下,MySQL会直接跳过该行。可以查看MySQL错误日志(通常在
data目录下的.err文件),里面会记录导入时的具体错误信息。 - 约束限制:表中存在非空约束、外键约束、唯一约束等时,若CSV中对应字段为空、不符合外键关联要求,会导致该行插入失败被跳过。同样可通过错误日志定位具体的约束冲突。
3. CSV文件本身存在格式异常
- 未闭合的包围符:某行字段的包围符(如双引号)只开启未闭合,会导致MySQL将后续多行视为同一个字段,直到找到下一个匹配的包围符,这中间的行都会被合并为一条记录,最终统计行数大幅减少。
- 无效/空行:CSV文件中存在空行、格式混乱的行(比如字段数量与表字段数不匹配),MySQL解析这些行时会直接跳过,造成记录丢失。
4. 记录数统计误差
- CSV行数统计错误:确认CSV记录数的统计方式是否正确,比如用Windows PowerShell执行
(Get-Content "C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/20230727_Shipments.csv").Count,得到总行数后减1(因导入时忽略首行),再与数据库记录数对比,避免第三方工具统计的误差。 - 数据库统计误差:查询数据库记录数时,确保使用
COUNT(*)而非COUNT(字段名)(若字段存在NULL值会导致统计偏少),同时确认导入操作已提交事务,没有未提交的记录未被统计。
内容的提问来源于stack exchange,提问作者Musharraf Tameer Islam
相关产品推荐
相关产品推荐

