【发布时间】:2016-10-03 19:40:17
【问题描述】:
有没有办法在 LOAD DATA INFILE 中动态指定文件名?可以参数化,例如(语法可能不正确) LOAD DATA INFILE '$filename'?
【问题讨论】:
有没有办法在 LOAD DATA INFILE 中动态指定文件名?可以参数化,例如(语法可能不正确) LOAD DATA INFILE '$filename'?
【问题讨论】:
来自MySQL documentation的引用:
LOAD DATA INFILE 语句以非常高的速度将文本文件中的行读取到表中。文件名必须以字符串形式给出。
这意味着它不能是准备好的语句的参数。但是没有人禁止在语句只是 PHP 代码中的字符串时进行字符串插值。
【讨论】:
不幸的是,MySQL 尚不支持此功能,目前列为错误/功能请求 #39115 http://bugs.mysql.com/bug.php?id=39115
【讨论】:
或者您可以制作文件的临时副本(BATCH 示例):
LOAD_DATA.bat
COPY %1 TempFileToLoad.csv
mysql --user=myuser --password=mypass MyDatabase < ScriptLoadMyDatabase.sql
DEL TempFileToLoad.csv
SQL(供参考):
ScriptLoadMyDatabase.sql
load data infile 'TempFileToLoad.csv' IGNORE
into table tLoad
FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"'
lines terminated by '\r\n'
IGNORE 1 LINES
(@DateCrea, NomClient, PrenomClient, TypeMvt, @Montant, NumeroClient)
set DateCrea = str_to_date(@DateCrea, '%Y-%m-%d'), Montant = (round(@Montant / 1000)*2) ;
并完成在 SendTo windows 文件夹中放置 BAT 文件的链接。
【讨论】:
如果你问它是否可以在脚本中使用;你可以用 php 做这样的事情:
<?php
$mysqli = new mysqli("host", "user", "pwd", "db");
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$sql = "CREATE TABLE number1 (id INT PRIMARY KEY auto_increment,data TEXT)";
if ($result = $mysqli->query($sql)) {
} else {
printf("<br>%s",$mysqli->error);
}
$host = $_SERVER['HTTP_HOST'];
$uri = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
$filename = "data.csv";
$sql = "LOAD DATA LOCAL INFILE '$host$uri$filename' INTO TABLE number1";
if ($result = $mysqli->query($sql)) {
} else {
printf("<br>%s",$mysqli->error);
}
// Close the DB connection
$mysqli->close();
exit;
%>
如果文件与脚本位于同一文件夹中,只需使用 $filename a 而不是 $host$uri$filename。我从我正在使用的几个脚本中快速将其组合在一起,如果没有调试它就无法工作,很抱歉,但它应该非常接近。它需要 mysqli。
【讨论】: