【问题标题】:Use mysql embedded and --local-infile=1 with c++?将 mysql 嵌入和 --local-infile=1 与 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";

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

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

【问题讨论】:

    标签: c++ mysql embedded-database


    【解决方案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 以公开连接结构 :(

    【讨论】:

      猜你喜欢
      • 2017-09-11
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      • 2012-03-21
      • 2013-09-24
      • 2020-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多