我知道有其他解决方案可以解决此问题,但对我而言不起作用。
我正在尝试通过Yii2网站在MySQL数据库中执行LOAD DATA LOCAL INFILE语句。过去我已经做到了这一点,所以我不确定为什么它不再起作用了。
我收到以下错误:
SQLSTATE [42000]:语法错误或访问冲突:1148 此MySQL版本不允许使用该命令
我的db.php配置文件中确实有以下设置。
'attributes' => [ PDO::MYSQL_ATTR_LOCAL_INFILE => true ],
我也尝试禁用secure-file-priv无济于事。
编辑
我尝试从Workbench运行以下查询,它也通过Workbench引发错误。但是,它适用于MySQL 5.7。我目前正在使用8.0
LOAD DATA LOCAL INFILE 'D:/Temp/6_attlog.dat' IGNORE
INTO TABLE att_log
FIELDS TERMINATED BY '\t' ENCLOSED BY '''' LINES TERMINATED BY '\r\n' IGNORE 0 LINES
(@id, `date_time`, `dev_id`, `mode`, `work_code`, `work_code1`) SET `id` = TRIM(@id)
编辑2
我知道它可以与“ LOAD DATA INFILE”一起使用...
...但不适用于“ LOAD DATA 本地 INFILE”
这是我使用的代码...
$inFile = str_replace('\\', '/', realpath('uploads/'.$model->file->name));
Yii::$app->db->createCommand('
LOAD DATA LOCAL
INFILE \''.$inFile.'\' IGNORE
INTO TABLE att_log
FIELDS TERMINATED BY \'\\t\'
ENCLOSED BY \'\'\'\'
LINES TERMINATED BY \'\r\n\'
IGNORE 0 LINES
(@id, `date_time`, `dev_id`, `mode`, `work_code`, `work_code1`)
SET `id` = TRIM(@id)
')->execute();
unlink($inFile);
答案 0 :(得分:0)
只是一个建议
在PHP中,您可以使用单引号和双引号,因此可以以更简单的方式构建命令,例如:
$inFile = str_replace('\\', '/', realpath('uploads/'.$model->file->name));
Yii::$app->db->createCommand("
LOAD DATA LOCAL
INFILE '".$inFile."' IGNORE
INTO TABLE att_log
FIELDS TERMINATED BY '\t'
ENCLOSED BY '\'
LINES TERMINATED BY '\r\n\'
IGNORE 0 LINES
(@id, `date_time`, `dev_id`, `mode`, `work_code`, `work_code1`)
SET `id` = TRIM(@id)
")->execute();
unlink($inFile);
答案 1 :(得分:0)
根据MySQL文档,服务器需要配置为允许LOCAL
关键字:
LOCAL
仅在服务器和客户端都已配置为允许时才有效。例如,如果mysqld是在禁用local_infile
系统变量的情况下启动的,则LOCAL
不起作用。
https://dev.mysql.com/doc/refman/8.0/en/load-data.html
您确定服务器已正确配置为允许该关键字吗?