Yii2 加载数据本地 INFILE
Yii2 LOAD DATA LOCAL INFILE
我知道这个问题还有其他解决方案,但对我没有用。
我正在尝试通过 Yii2 网站在 MySQL 数据库中执行 LOAD DATA LOCAL INFILE 语句。我以前用过这个,所以我不确定为什么它不再起作用了。
我收到以下错误:
SQLSTATE[42000]: Syntax error or access violation: 1148 The used
command is not allowed with this MySQL version
我的 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 LOCAL 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);
只是一个建议
在 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);
根据 MySQL 文档,服务器需要配置为允许 LOCAL
关键字:
LOCAL
works only if your server and your client both have been configured to permit it. For example, if mysqld was started with the local_infile
system variable disabled, LOCAL
does not work.
https://dev.mysql.com/doc/refman/8.0/en/load-data.html
您确定您的服务器已正确配置为允许此关键字吗?
我知道这个问题还有其他解决方案,但对我没有用。
我正在尝试通过 Yii2 网站在 MySQL 数据库中执行 LOAD DATA LOCAL INFILE 语句。我以前用过这个,所以我不确定为什么它不再起作用了。
我收到以下错误:
SQLSTATE[42000]: Syntax error or access violation: 1148 The used command is not allowed with this MySQL version
我的 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 LOCAL 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);
只是一个建议
在 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);
根据 MySQL 文档,服务器需要配置为允许 LOCAL
关键字:
LOCAL
works only if your server and your client both have been configured to permit it. For example, if mysqld was started with thelocal_infile
system variable disabled,LOCAL
does not work.
https://dev.mysql.com/doc/refman/8.0/en/load-data.html
您确定您的服务器已正确配置为允许此关键字吗?