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

Posted

技术标签:

【中文标题】将 mysql 嵌入和 --local-infile=1 与 c++ 一起使用?【英文标题】:Use mysql embedded and --local-infile=1 with c++? 【发布时间】:2011-12-27 17:34:17 【问题描述】:

我正在使用 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";

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

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

【问题讨论】:

【参考方案1】:

@QLands 我意识到自从您提出这个问题以来已经过去了一年多,但我想我会回复后代,以防像我这样的其他人正在谷歌搜索解决方案。

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

经过大量的谷歌搜索并找到一些后巷的技术支持帖子,我得出的结论是 MySQL C++ 连接器没有(无论出于何种原因)决定实现开发人员能够允许 local-infile= 1个选项。显然,有些人已经能够破解/分叉 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 或从命令行执行它或 hack/fork 现有的 mysql C++ api 以公开连接结构 :(

【讨论】:

以上是关于将 mysql 嵌入和 --local-infile=1 与 c++ 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

百万行超大csv如何快速导入mysql

基线检查(高)基线检查--禁用local-infile选项(访问控制)

为啥 MySQL 禁用加载本地 infile 不起作用?

MySQL:启用 LOAD DATA LOCAL INFILE

如何设置 MySQL 连接器/Python X DevAPI 连接的选项?

有没有办法将数据库表的关系视图嵌入 MySQL