【问题标题】:"1064 - You have an error in your SQL syntax" when LOAD DATA INFILE with fields specification“1064 - 您的 SQL 语法有错误”当 LOAD DATA INFILE 使用字段规范时
【发布时间】:2020-10-18 21:52:16
【问题描述】:

我花了几个小时在这个网站上阅读可能超过 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 服务器版本相对应的手册,以获取在 '' IGNORE 1 LINES (field_1, field_2, field_3, field_4, field_5, field_6, ' 行附近使用的正确语法2

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

感谢您的帮助。

【问题讨论】:

  • 你还需要在 PHP 中的字符串中进行转义,否则转义序列会被插入那里。
  • 您的意思是将'\r\n' 转为'\\r\\n'
  • 是的。而对于另一个 \ 也是。
  • 我会测试,但其他人不是已经逃脱了吗?
  • 最后一个只有'\\r\\n'

标签: php mysql mysql-error-1064 load-data-infile


【解决方案1】:

简单的测试,只需编写一个小脚本并在 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)

【讨论】:

  • 谢谢,它成功了。我很困惑为什么我在其他地方的其他代码工作正常。我现在仔细检查了它,并没有像你在这里建议的那样逃脱。无论如何,问题解决了,非常感谢。
猜你喜欢
  • 2016-10-24
  • 1970-01-01
  • 1970-01-01
  • 2016-10-30
  • 2017-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多