4

エラー使用されたコマンドは、このMySQLバージョンでは許可されていません

一部のmysqlclientC++コードをMysql5.1から5.5に移行する際に問題が発生します(sociを使用)。C ++の部分はそれほど関連性がありません。問題は、MySQL5.5でLOADDATAINFILEを正常に実行できるmysqlclientコードを記述していることです。

これが私のメモです(LOAD DATA INFILEは失敗しますが、通常のクエリは問題ありません):

  1. 以下のコードは、Mysql 5.1、gcc 4.6.1、Oneiricで正常に動作します

  2. 同じコードがMysql5.5、gcc 4.7.2、Quantalで失敗します

  3. mysql(コマンドラインクライアント)からDATA INFILEをロードすると、正常に動作します(my.cnfをlocal-infile = 1で更新しました)

  4. 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'";
}
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 に答える