将 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++ 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章
基线检查(高)基线检查--禁用local-infile选项(访问控制)
MySQL:启用 LOAD DATA LOCAL INFILE