4

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

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

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

  1. 下面的代码在 Mysql 5.1、gcc 4.6.1、Oneiric 上运行良好

  2. 相同的代码在 Mysql 5.5、gcc 4.7.2、Quantal 上失败

  3. 如果我从 mysql(命令行客户端)加载数据输入文件,它工作正常(我已经用 local-infile=1 更新了 my.cnf)

  4. mysql> 显示变量,如 '%local_infile%'; 结果打开

如果有一个 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'";
}
4

1 回答 1

3

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

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 );
}
于 2012-10-30T06:05:09.833 回答