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

Excel生成CSV导入MySQL时LOAD DATA引号处理异常求助

MySQL LOAD DATA INFILE 处理Excel生成的整行包裹引号CSV问题

问题背景

用DbVisualizer 23.1编辑MySQL 8.0查询,学习SQL时导入Excel 365生成的CSV文件:

  • CSV对应Movies和Boxoffice表,Excel里只有A列有内容,用逗号分隔;仅“Monsters, Inc.”这个内容带引号,其余行无引号
  • 但用记事本或MySQL打开时,整行内容被双引号包裹(CSV内容见下文)
  • 尝试用LOAD DATA INFILE语句,指定OPTIONALLY ENCLOSED BY '"'处理引号,却触发错误:

[Code: 1366, SQL State: HY000] Incorrect integer value:
'"5,8.2,380843261,555900000" "14,7.4,268492764,475066843"
"8,8,206445654,417277164" "12,6.4,191452396,368400000" "3,7.9,24585'
for column 'Movie_id' at row 1

  • 目前能通过SET Movie_id = CAST(REPLACE(@Movie_id, '"', '') AS UNSIGNED)手动替换引号导入,但每次都这么做太繁琐
  • 疑问:查资料说ENCLOSED BY或OPTIONALLY ENCLOSED BY应该自动忽略引号,到底哪里错了?

记事本打开的Boxoffice.csv内容

"5,8.2,380843261,555900000"
"14,7.4,268492764,475066843"
"8,8,206445654,417277164"
"12,6.4,191452396,368400000"
"3,7.9,245852179,239163000"
"6,8,261441092,370001000"
"9,8.5,223808164,297503696"
"11,8.4,415004880,648167031"
"1,8.3,191796233,170162503"
"7,7.2,244082982,217900167"
"10,8.3,293004164,438338580"
"4,8.1,289916256,272900000"
"2,7.2,162798565,200600000"
"13,7.2,237283207,301700000"

原因

OPTIONALLY ENCLOSED BY是用来处理单个字段被引号包裹的场景(比如字段内容含逗号,用引号把单个字段括起来),但你的CSV是整行被双引号包裹——MySQL会把整行的引号当成字段内容的一部分,根本识别不出逗号分隔的列,直接把整行内容塞进第一个字段Movie_id,自然报整数格式错误。

解决方案

方案1:重新生成标准CSV(推荐)

问题根源在Excel导出的格式不对:

  • 你现在是把所有字段都放在A列的一个单元格里,Excel导出时会把这个单元格的内容(整行字段)当成单个值,自动加双引号包裹
  • 正确做法是把每个字段分到单独列:Movie_id放A列,Rating放B列,Domestic_sales放C列,International_sales放D列,再导出CSV。这样Excel只会给含逗号的字段(比如“Monsters, Inc.”)加引号,符合标准CSV格式,OPTIONALLY ENCLOSED BY '"'就能正常工作。

方案2:调整LOAD DATA语句适配当前CSV

如果暂时没法重新生成CSV,修改语句先读取整行,再拆分字段:

LOAD DATA INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/Boxoffice.csv'
INTO TABLE Boxoffice
(@row)
SET 
  Movie_id = SUBSTRING_INDEX(SUBSTRING(@row, 2, LENGTH(@row)-2), ',', 1),
  Rating = SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING(@row, 2, LENGTH(@row)-2), ',', 2), ',', -1),
  Domestic_sales = SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING(@row, 2, LENGTH(@row)-2), ',', 3), ',', -1),
  International_sales = SUBSTRING_INDEX(SUBSTRING(@row, 2, LENGTH(@row)-2), ',', -1);
  • SUBSTRING(@row, 2, LENGTH(@row)-2):去掉整行首尾的双引号
  • SUBSTRING_INDEX:按逗号拆分出对应位置的字段

方案3:尝试转义配置(仅适用于标准字段包裹场景)

如果CSV内部的引号有转义(比如"Monsters, Inc."写成""Monsters, Inc.""),可以试试这个语句,但对你当前整行包裹的情况大概率无效:

LOAD DATA INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/Boxoffice.csv'
INTO TABLE Boxoffice
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
ESCAPED BY '"'
LINES TERMINATED BY '\n'
(Movie_id, Rating, Domestic_sales, International_sales);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 16:17:54