有没有办法在 LOAD DATA INFILE 中动态指定文件名?它可以像例如(语法可能不正确)LOAD DATA INFILE'$filename'那样参数化吗?
问问题
10075 次
4 回答
2
来自MySQL 文档的引用:
LOAD DATA INFILE 语句以非常高的速度将文本文件中的行读取到表中。文件名必须以文字字符串的形式给出。
这意味着它不能是准备好的语句的参数。但是没有人禁止在语句只是 PHP 代码中的字符串时进行字符串插值。
于 2010-05-14T11:52:50.730 回答
2
不幸的是,MySQL 尚不支持此功能,目前列为错误/功能请求 #39115 http://bugs.mysql.com/bug.php?id=39115
于 2013-02-16T00:01:22.290 回答
2
或者您可以制作文件的临时副本(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 文件的链接。
于 2013-03-26T03:38:34.413 回答
0
如果您问是否可以在脚本中使用它;你可以用 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。
于 2010-06-17T15:17:49.797 回答