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
相关产品推荐
相关产品推荐

