MySQL LOAD DATA导入CSV遇三重双引号问题求助
MySQL LOAD DATA 导入CSV的转义异常解决方法
问题描述
我尝试使用MySQL的LOAD DATA语句导入CSV文件,语句如下:
load data local infile 'myfile' into table `mytable` fields terminated by ',' ESCAPED BY '' optionally enclosed by '"' lines terminated by '\n' ignore 1 lines
我的CSV格式规则:
- 仅当字符串包含逗号(字段分隔符)时,用双引号包裹字段
- 字符串本身含双引号时,用两个双引号(
"")转义
但当字符串结尾是转义双引号且内部含逗号时,会形成三重双引号(示例行如下),导致MySQL加载异常:持续读取后续行直至字段内存耗尽,随后跳过约30000行数据。我试过转义双引号、替换首尾引号,但LOAD DATA仅允许使用ASCII字符作为包裹符,多数ASCII字符已在数据中使用,扩展ASCII字符也无效。
示例异常行:
3,"words words words, ""words in quotes"""
解决方法
方案1:调整LOAD DATA参数(推荐)
问题根源是错误设置了ESCAPED BY '',未指定正确的转义符。由于CSV用双引号(")作为转义字符(用""表示单个"),只需将ESCAPED BY设置为'"'即可让MySQL正确解析转义规则:
LOAD DATA LOCAL INFILE 'myfile' INTO TABLE `mytable` FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '"' -- 指定双引号为转义符,解析""为单个" LINES TERMINATED BY '\n' IGNORE 1 LINES;
这条语句会正确处理示例行:
- 识别开头的
"为字段包裹起始 - 将字段内的
""解析为单个" - 识别末尾的
"为字段包裹结束
最终得到正确的字段内容:words words words, "words in quotes"
方案2:预处理CSV文件(备选)
如果因权限或环境限制无法调整LOAD DATA参数,可以用脚本预处理CSV,修正结尾的三重双引号问题。例如用sed命令批量替换:
sed -i 's/"$/""/' your_file.csv
这条命令会把每行末尾的单个"替换为"",让原本的三重双引号(""")变成"""",配合原有LOAD DATA语句即可正确识别字段结束符。
或者用Python脚本做更精准处理(适合复杂场景):
import csv with open('myfile.csv', 'r', encoding='utf-8') as infile, open('fixed_myfile.csv', 'w', encoding='utf-8', newline='') as outfile: reader = csv.reader(infile, quotechar='"', doublequote=True, delimiter=',') writer = csv.writer(outfile, quotechar='"', doublequote=True, delimiter=',', quoting=csv.QUOTE_MINIMAL) # 跳过表头 next(reader) for row in reader: writer.writerow(row)
这个脚本会用标准CSV规则重新写入文件,自动修正转义异常的行。
内容的提问来源于stack exchange,提问作者darkflux
相关产品推荐
相关产品推荐

