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

MySQL导入首尾带引号的CSV至表:如何忽略行首尾引号?

解决CSV整行首尾带引号的MySQL导入问题

我明白你的困扰——当CSV每行首尾都被引号包裹时,OPTIONALLY ENCLOSED BY '"'确实帮不上忙,因为它是针对单个字段的引号处理,而非整行。这里有两种实用的解决方案,你可以根据自己的CSV格式选择:

方法1:利用行起始/终止符自动跳过引号

如果你的CSV每行严格以"开头,以"\n结尾(也就是你当前指定的行终止符),可以直接在LOAD DATA语句中添加LINES STARTING BY '"',让MySQL自动忽略每行开头的引号,配合你已有的行终止符设置,就能完美去掉首尾的引号:

LOAD DATA LOCAL INFILE '/path/data.csv' 
INTO TABLE test1 
FIELDS TERMINATED BY ';' 
LINES STARTING BY '"' 
TERMINATED BY '"\n' 
IGNORE 1 ROWS;

原理很简单:STARTING BY '"'告诉MySQL跳过每行开头的引号字符,TERMINATED BY '"\n'则把"+换行作为行的结束标记,这样中间的字段内容就会被正确识别,不会带上首尾的引号。

方法2:用TRIM函数手动处理整行内容

如果你的CSV格式不太规整(比如部分行没有首尾引号,或者引号位置不一致),可以先把整行内容读入一个临时变量,再通过TRIM去掉首尾引号,最后拆分字段映射到表列:

假设你的test1表有3列(column1、column2、column3),可以这样写:

LOAD DATA LOCAL INFILE '/path/data.csv' 
INTO TABLE test1 
FIELDS TERMINATED BY ';' 
LINES TERMINATED BY '\n' 
IGNORE 1 ROWS
(@row)  -- 把整行内容读入临时变量@row
SET 
  column1 = TRIM(BOTH '"' FROM SUBSTRING_INDEX(@row, ';', 1)),
  column2 = TRIM(BOTH '"' FROM SUBSTRING_INDEX(SUBSTRING_INDEX(@row, ';', 2), ';', -1)),
  column3 = TRIM(BOTH '"' FROM SUBSTRING_INDEX(@row, ';', -1));

这个方法的优势是灵活性高,不管行首尾有没有引号,TRIM(BOTH '"' FROM ...)都会把字段内容前后的引号去掉。你只需要根据表的列数,调整SUBSTRING_INDEX的参数即可(比如第N列就用SUBSTRING_INDEX(SUBSTRING_INDEX(@row, ';', N), ';', -1))。

建议先拿少量数据测试一下,确保导入结果符合预期哦!

内容的提问来源于stack exchange,提问作者homeStayProg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:45:22