Mysql 5.5 LOAD DATA INFILE权限

时间:2012-10-30 05:10:38

标签: c++ mysql

错误此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. 上失败
  4. 如果我从mysql(命令行客户端)加载数据INFILE,它工作正常(我用local-infile = 1更新了my.cnf)

  5. 的MySQL>显示'%local_infile%'等变量;导致ON

  6. 如果有一个社交网络或配置解决方案会很好,但是如果有人设法让它与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'";
    }
    

1 个答案:

答案 0 :(得分: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 );
}