c++ - 将 mysql embedded 和 --local-infile=1 与 c++ 一起使用?

标签 c++ mysql embedded-database

我正在使用 C++ 中的嵌入服务器(链接到 mysqld)连接到 mysql 数据库。我有以下代码:

static char *server_options[] = \
        { (char *)"mysql_test",
          (char *)"--datadir=/home/cquiros/temp/mysql/db2",
          (char *)"--default-storage-engine=MyISAM",
          (char *)"--loose-innodb=0",
          (char *)"--local-infile=1",
          (char *)"--skip-grant-tables=1",
          (char *)"--myisam-recover=FORCE",
          (char *)"--key_buffer_size=16777216",
          (char *)"--character-set-server=utf8",
          (char *)"--collation-server=utf8_bin",
          NULL };

        int num_elements = (sizeof(server_options) / sizeof(char *)) - 1;

        mysql_library_init(num_elements, server_options, NULL);
        m_mysql = mysql_init(NULL);

        char enable_load_infile = 1;
        if (mysql_options(m_mysql,MYSQL_OPT_LOCAL_INFILE, (const char *)&(enable_load_infile)))
            qDebug() << "Error setting option";

        mysql_real_connect(m_mysql, NULL,NULL,NULL, "database1", 0,NULL,0);

连接有效,我可以查询和创建表,但是,当我尝试执行“加载数据本地 infile ...”时,我总是得到“此 MySQL 版本不允许使用的命令”,即使我正在设置 - -local-infile=1 在服务器选项中或在代码中设置:

char enable_load_infile = 1;
        if (mysql_options(m_mysql,MYSQL_OPT_LOCAL_INFILE, (const char *)&(enable_load_infile)))
            qDebug() << "Error setting option";

知道我做错了什么以及如何解决吗?

非常感谢您的帮助。 卡洛斯。

最佳答案

@QLands 我意识到你问这个问题已经一年多了,但我想我只是为了后代才回答,以防其他像我这样的人在谷歌上搜索解决方案。

我遇到了同样的问题,在/etc/mysql/my.cfg 文件中明确启用它后,我可以从 Linux mysql CLI 获取 LOAD DATA LOCAL INFILE 语句。但是我无法让它与 MySQL C++ 连接器一起工作——当我尝试通过 MySQL C++ 连接器运行 LOAD DATA LOCAL INFILE 命令时,我也收到错误“此 MySQL 版本不允许使用该命令”。 wtf 对吗?

经过大量勤奋的谷歌搜索并找到一些后巷技术支持帖子后,我得出结论,MySQL C++ 连接器没有(无论出于何种原因)决定为开发人员实现能够允许 local-infile= 1 个选项。显然有些人已经能够 hack/fork MySQL C++ 连接器来公开功能,但没有人发布他们的源代码——只是说它有效。显然,在您初始化连接后,MySQL C API 中有一个变通方法:

mysql_options( &mysql, MYSQL_OPT_LOCAL_INFILE, 1 );

以下是一些使我得出此结论的引用文章:

1.) How can I get the native C API connection structure from MySQL Connector/C++?

2.) Mysql 5.5 LOAD DATA INFILE Permissions

3.) http://osdir.com/ml/db.mysql.c++/2004-04/msg00097.html

基本上,如果您想要使用 LOAD DATA LOCAL INFILE 功能的能力——您必须使用 mysql C API 或从命令行执行它,或者破解/派生现有的 mysql C++ api 以公开连接结构 :(

关于c++ - 将 mysql embedded 和 --local-infile=1 与 c++ 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8647505/

相关文章:

c++ - 如何使用 C++ 计算表中每年的更新平均速度?

mysql - 在 Rails 中的参数化 SQL 查询中转义 ':' 和 '?'

mysql - 如何修复 #1227 - 访问被拒绝错误并在到期时从数据库中删除行

mysql - SQL 更新修改表中的列

android - Android 上的 H2 数据库与 SQLite

java - 无法在 JUnit 测试类中 Autowiring Spring bean

java - 运行集成测试时嵌入 MongoDB

c++ - 使用 C 通过引用传递数组

c++ - Base *p = new Derived() 中的内存分配

c++ - 如何使用 string::replace 方法写入文件?