错误此MySQL版本不允许使用的命令
我在将一些mysqlclient C ++代码从Mysql 5.1迁移到5.5(使用soci)时遇到问题。 C ++部分不那么相关 - 问题是编写一些mysqlclient代码,可以在MySQL 5.5上成功地执行LOAD DATA INFILE。
这是我的笔记(LOAD DATA INFILE失败,但正常查询没问题):
以下代码适用于Mysql 5.1,gcc 4.6.1,Oneiric
相同的代码在Mysql 5.5,gcc 4.7.2,Quantal
如果我从mysql(命令行客户端)加载数据INFILE,它工作正常(我用local-infile = 1更新了my.cnf)
的MySQL>显示'%local_infile%'等变量;导致ON
如果有一个社交网络或配置解决方案会很好,但是如果有人设法让它与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'";
}
答案 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 );
}