MySQL LOAD DATA INFILE 曾正常运行后突然报ENCLOSED BY语法错误
问题根因
你的报错是LOAD DATA INFILE语句的参数顺序不符合MySQL语法规则导致的,和ENCLOSED BY本身功能无关:
MySQL要求FIELDS相关的所有配置项(TERMINATED BY、ENCLOSED BY、ESCAPED BY)必须作为连续子句放在一起,不能把LINES相关的配置插在FIELDS的两个参数中间。
你报错的语句存在顺序错误:
mysql> LOAD DATA INFILE "C:\\ProgramData\\MySQL\\MySQL Server 8.0\\Uploads\\earthquakes.csv" -> INTO TABLE sql_earthquakes.tremblor2 -> FIELDS TERMINATED BY ',' -> LINES TERMINATED BY '\n' -- 此处错误将LINES子句插入到FIELDS子句的两个参数中间 -> ENCLOSED BY '"' -> IGNORE 1 LINES;
而后续执行成功的语句,是将ENCLOSED BY '"'放回了FIELDS子句内、LINES子句放在FIELDS子句之后,符合语法要求,因此可以正常运行。
至于复制粘贴相同语句也报错的问题,大概率是复制时不小心错乱了行序,或粘贴时多插入了换行导致参数顺序被打乱。
解决方法
- 严格遵循
LOAD DATA INFILE的固定语法顺序编写语句,核心顺序如下:LOAD DATA INFILE+ 文件路径INTO TABLE+ 目标表名- 可选的字符集配置
- 所有FIELDS相关配置(连续编写,不要插入其他子句)
- 所有LINES相关配置(连续编写,放在FIELDS配置之后)
IGNORE N LINES+ 可选的列映射规则
- 日常使用时可以固定把FIELDS的常用参数连在一起写,比如固定格式为
FIELDS TERMINATED BY ',' ENCLOSED BY '"',写完后再编写LINES相关配置,避免顺序错乱。
另外你后续成功执行时出现的27759条警告,是因为表中occurred_on字段为date类型,如果CSV中该列存储的是带时分秒的时间格式,导入时会自动截断导致警告,将字段类型改为datetime或导入时增加格式转换逻辑即可消除警告。
内容的提问来源于stack exchange,提问作者user17352980
相关产品推荐
相关产品推荐

