错误 此 MySQL 版本不允许使用的命令

我在将某些 mysqlclient C++ 代码从 Mysql 5.1 迁移到 5.5(使用 soci)时遇到问题。 C++ 部分不是那么相关 - 问题是编写一些可以在 MySQL 5.5 上成功执行 LOAD DATA INFILE 的 mysqlclient 代码。

这是我的笔记(LOAD DATA INFILE 失败,但正常查询没问题):

  • 下面的代码在 Mysql 5.1、gcc 4.6.1、Oneiric
  • 上运行良好
  • 相同的代码在 Mysql 5.5、gcc 4.7.2、Quantal
  • 上失败
  • 如果我从 mysql(命令行客户端)加载 DATA INFILE,它工作正常(我已经用 local-infile=1 更新了 my.cnf)
  • mysql> 显示变量如 '%local_infile%';结果 ON

  • 如果有一个 SOCI 或一个配置解决方案,那就太好了,但是如果有人设法让它与 libmysqlclient 一起工作,那也很高兴知道......
    #include <soci.h>
    #include <mysql/soci-mysql.h>
    #include <string>
    #include <iostream>
    
    using soci::use;
    
    using namespace std;
    using namespace soci;
    
    main()
    {
      string val =
        "mysql://"          +
        "host=127.0.0.1"    +
        " dbname=tmp_db"    +
        " user=root"        +
        " password=open_sasame";
    
        int sum;
    
        session sql( val );
        sql  << "SELECT 1+1", into( sum );
        cerr << "RESULT=" << sum << endl;     // works fine
    
        // NEXT LINE FAILS WITH:
        //   The used command is not allowed with this MySQL version
        sql  << "LOAD DATA LOCAL INFILE '/tmp/junk3.txt' INTO TABLE tmp_db.example_tbl FIELDS TERMINATED BY '|' LINES TERMINATED BY '\\n'";
    }
    

    最佳答案

    答案是,我们需要下面这行代码:

    mysql_options( &mysql, MYSQL_OPT_LOCAL_INFILE, 0 );
    

    插入 mysql_init()mysql_real_connect() 之间。

    下面是一段 C 代码供引用。请注意,可以使用这行代码修补 SOCI 的 mysql 后端以使其正常工作。

    在 Mysql 5.5、gcc 4.7.2、Quantal 上测试和工作。
    #include <mysql.h>
    #include <stdio.h>
    
    main()
    {
      MYSQL mysql;
    
      mysql_init( &mysql );
      mysql_options( &mysql, MYSQL_OPT_LOCAL_INFILE, 0 );
      if ( !mysql_real_connect( &mysql,"127.0.0.1","root","open_sasame","tmp_db",0,NULL,0 ))
      {
        fprintf(stderr, "Failed to connect to database: Error: %s\n",
          mysql_error( &mysql ));
      }
    
      if ( mysql_query( &mysql, "LOAD DATA LOCAL INFILE '/tmp/junk4.txt' "
        "INTO TABLE tmp_db.example_tbl FIELDS TERMINATED BY '|' "
        "LINES TERMINATED BY '\\n'" ))
      {
        fprintf( stderr, "ERROR DURING LOAD DATA LOCAL INFILE\n" );
      }
    
      mysql_close( &mysql );
    }
    

    10-08 07:58
    查看更多