6

有没有办法在 LOAD DATA INFILE 中动态指定文件名?它可以像例如(语法可能不正确)LOAD DATA INFILE'$filename'那样参数化吗?

4

4 回答 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 回答