如何解决MySQL LOAD DATA INFILE导入含单元格内换行CSV的异常问题
问题1解答
LOAD DATA INFILE 默认配置下确实无法识别被引号包裹的单元格内换行,原因是你仅指定了行终止符为\n,程序会直接把所有\n判定为行分隔符,不会校验该符号是否处于OPTIONALLY ENCLOSED BY指定的引号包裹范围内。这也是你出现字段截断、引号错位的核心原因。
解决方案
如果你使用的是MySQL 8.0.34及以上版本,只需要在FIELDS配置项后增加ESCAPED BY ''参数即可。Google Sheets导出的CSV遵循标准CSV规范,单元格内的双引号会用两个连续双引号转义,不需要用反斜杠转义,增加该配置后程序会自动识别引号包裹范围内的换行属于单元格内容,不会判定为行结束,修正后的导入语句如下:
LOAD DATA INFILE '/var/lib/mysql-files/classes.csv' INTO TABLE `AuxClasses` FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '' LINES TERMINATED BY '\n' IGNORE 3 LINES ( `Category`, `Section`, `Subsection`, `ClassNumber`, `ClassTitle` );
如果使用的是更低版本的MySQL,原生LOAD DATA INFILE对单元格内换行的支持有缺陷,建议用Python、PHP等语言的CSV解析模块先读取文件,再逐行写入数据库,兼容性更高。
问题2解答
是的,IGNORE N LINES的逻辑是直接跳过文件开头的N个文本行,完全不会先做CSV格式解析,只要遇到一个行终止符就算一行。如果你需要忽略的前三行表头中本身就包含单元格内换行,那实际跳过的内容就会和预期不符,最终导致首条数据错位、格式混乱。
这种情况建议你导入前先手动删除CSV文件开头不需要的表头行,再执行导入操作,避免计数错误。
内容的提问来源于stack exchange,提问作者TRiG
相关产品推荐
相关产品推荐

