php - “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'
但我看不出有任何问题,因为完全相同的行终止定义正在代码的其他部分工作。
谢谢您的帮助。
解决方案
简单的测试,只需编写一个小脚本并在 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)
推荐阅读
- python - 如何在大于实际屏幕区域的窗口中显示绘图?
- crash - zynq pl 会导致内核崩溃吗?
- postgresql - 如何更新 postgres 数组中的 json?
- sql-server - 我可以将在 SQL Server 中存储为 XML 的 SVG(仅)转换为不同的图像类型吗?
- fork - 如何分叉 Uniswap V2 接口?
- c# - 如何使用 C# 使用 LDAP/OID 连接字符串连接到 Oracle
- python - sklearn-crfsuite - 处理数值/连续特征
- python - 又一个“没有已知父包的尝试相对导入”
- python - 使用张量流计算雅可比和梯度
- amazon-web-services - 如何将 Terraform 状态与现有资源同步?