首页 > 解决方案 > “1064 - 您的 SQL 语法有错误”当 LOAD DATA INFILE 使用字段规范时

问题描述

我花了几个小时在这个网站上阅读可能超过 10 个不同的问答,并多次查看我的以下查询,但仍然找不到问题所在。这是我的PHP代码中的查询定义行:

$q="LOAD DATA INFILE '$filename' 
    IGNORE INTO TABLE `temp_data_1` 
    FIELDS TERMINATED BY ',' ENCLOSED BY '\"' ESCAPED BY '\\' 
    LINES TERMINATED BY '\r\n' IGNORE 1 
    LINES (`field_1`, `field_2`, `field_3`, `field_4`, `field_5`, 
            `field_6`, `field_8`, `field_9`) 
        SET `field_7` = SUBSTRING_INDEX(`field_6`, '.',-1)";

$filename上传CSV文件后设置。非常相似的代码可以工作,phpMyAdmin但我不能让它在我的PHP代码中工作。我不断收到此错误:

1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 2 行的 '' IGNORE 1 LINES ( field_1, field_2, field_3, field_4, field_5, , ' 附近使用正确的语法field_6

我怀疑它与它有关,LINES TERMINATED BY '\r\n'但我看不出有任何问题,因为完全相同的行终止定义正在代码的其他部分工作。

谢谢您的帮助。

标签: phpmysqlmysql-error-1064load-data-infile

解决方案


简单的测试,只需编写一个小脚本并在 CLI 中运行它以查看从您的字符串中得到什么输出。

$filename = 'dsafsdf';

$q="LOAD DATA INFILE '$filename' 
    IGNORE INTO TABLE `temp_data_1` 
    FIELDS TERMINATED BY ',' ENCLOSED BY '\\\"' ESCAPED BY '\\\' 
    LINES TERMINATED BY '\\r\\n' IGNORE 1 
    LINES (`field_1`, `field_2`, `field_3`, `field_4`, `field_5`, 
            `field_6`, `field_8`, `field_9`) 
        SET `field_7` = SUBSTRING_INDEX(`field_6`, '.',-1)";
echo $q;

输出是

LOAD DATA INFILE 'dsafsdf' 
    IGNORE INTO TABLE `temp_data_1` 
    FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\' 
    LINES TERMINATED BY '
' IGNORE 1 
    LINES (`field_1`, `field_2`, `field_3`, `field_4`, `field_5`, 
            `field_6`, `field_8`, `field_9`) 
        SET `field_7` = SUBSTRING_INDEX(`field_6`, '.',-1)

请注意已被解释为 excape 字符的缺失\,因为您在双引号字符串中。因此,您现在需要做的就是添加相关数量的转义以获得正确的输出,如下所示

$q="LOAD DATA INFILE '$filename' 
    IGNORE INTO TABLE `temp_data_1` 
    FIELDS TERMINATED BY ',' ENCLOSED BY '\\\"' ESCAPED BY '\\\' 
    LINES TERMINATED BY '\\r\\n' IGNORE 1 
    LINES (`field_1`, `field_2`, `field_3`, `field_4`, `field_5`, 
            `field_6`, `field_8`, `field_9`) 
        SET `field_7` = SUBSTRING_INDEX(`field_6`, '.',-1)";
echo $q;

产生预期的结果

LOAD DATA INFILE 'dsafsdf' 
    IGNORE INTO TABLE `temp_data_1` 
    FIELDS TERMINATED BY ',' ENCLOSED BY '\"' ESCAPED BY '\\' 
    LINES TERMINATED BY '\r\n' IGNORE 1 
    LINES (`field_1`, `field_2`, `field_3`, `field_4`, `field_5`, 
            `field_6`, `field_8`, `field_9`) 
        SET `field_7` = SUBSTRING_INDEX(`field_6`, '.',-1)

推荐阅读