LOAD DATA LOCAL INFILE导入百万数据时双引号残留及记录丢失问题
问题原因排查
问题1:导入成功但字段保留双引号
- 核心原因:你在SQL中使用的
ENCLOSED BY '"'是HTML转义后的双引号实体,MySQL无法识别该字符作为字段包裹符,因此不会自动剥离字段两端的源文件双引号,最终导致内容原样存储。 - 次要影响:首次SQL中指定的行终止符为
\r,仅适配旧MacOS格式的文本,与多数场景下的文本行尾格式不匹配,但因为包裹符不生效未触发字段错位,所以全部记录可导入。
问题2:双引号正常去除但仅导入一半记录
- 核心原因:你的源TXT文件为Windows平台生成,行尾采用
\r\n(回车+换行)双字符作为终止符,调整后仅指定\n作为行终止符,会将上一行行尾的\r残留到当前行的字段头部,触发字段错位。 - 触发失败的约束:你创建的
temp_data表中AZ_Code字段设置了NOT NULL约束,字段错位后该字段为空的行会被直接判定为非法,导入失败,最终仅约一半符合字段匹配规则的记录能成功导入。 - 补充说明:调整后双引号可正常去除,说明你实际执行的SQL中
ENCLOSED BY已经改为了正确的双引号字符,包裹符逻辑生效。
解决方法
直接使用以下调整后的导入语句即可:
SET NAMES latin1; LOAD DATA LOCAL INFILE 'Base.txt' INTO TABLE temp_data CHARACTER SET latin1 FIELDS TERMINATED BY '\t' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES;
调整点说明:
- 将行终止符改为
\r\n,完全适配Windows格式的源文件,避免字段错位 - 使用
OPTIONALLY ENCLOSED BY '"'替代原有配置,兼容部分字段无包裹双引号的场景 - 确认
INFILE后的文件路径正确,避免多余空格导致找不到文件
可选优化建议:
- 若导入仍有失败,可在执行导入语句后立即执行
SHOW WARNINGS,查看具体的失败行号和错误原因,针对性处理异常数据 - 若源文件存在latin1不支持的特殊字符,可将表字段的字符集统一修改为
utf8mb4,避免乱码 - 导入前可临时关闭SQL严格模式,减少非核心约束导致的导入失败:
SET sql_mode = '';
内容的提问来源于stack exchange,提问作者TSCAmerica.com
相关产品推荐
相关产品推荐

