【问题标题】:Parameterizing file name in MYSQL LOAD DATA INFILE在 MYSQL LOAD DATA INFILE 中参数化文件名
【发布时间】:2016-10-03 19:40:17
【问题描述】:

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

【问题讨论】:

    标签: mysql load-data-infile


    【解决方案1】:

    来自MySQL documentation的引用:

    LOAD DATA INFILE 语句以非常高的速度将文本文件中的行读取到表中。文件名必须以字符串形式给出。

    这意味着它不能是准备好的语句的参数。但是没有人禁止在语句只是 PHP 代码中的字符串时进行字符串插值。

    【讨论】:

      【解决方案2】:

      不幸的是,MySQL 尚不支持此功能,目前列为错误/功能请求 #39115 http://bugs.mysql.com/bug.php?id=39115

      【讨论】:

        【解决方案3】:

        或者您可以制作文件的临时副本(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 文件的链接。

        【讨论】:

          【解决方案4】:

          如果你问它是否可以在脚本中使用;你可以用 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。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-09-24
            • 1970-01-01
            • 1970-01-01
            • 2013-05-26
            • 2012-10-05
            • 2010-11-17
            • 1970-01-01
            相关资源
            最近更新 更多