You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 03:00:10