数显声明一点,我是在本地与MySQL数据库引擎建立连接,而非远程。
从昨天晚上到今天早上,一直在和这个函数mysql_real_connect较劲,因为在程序中使用这个函数总是出错,返回值一直是NULL。找了好多教程,大多数都是对这个函数的介绍和简单的使用,很少有这个函数出错的解决。在尝试了许多操作之后,终于也能够成功使用这个函数了。由于所做的操作较多(其实也不多),我也不知道哪个是必须,哪个不是必须,但是既然成功了,就把这些操作都写出来。
首先对这个函数的介绍,可以参考这个链接:mysql_real_connect()_MySQL C API函数
很多博主对这个函数的讲解几乎都和这个一样,这个网址里面也有对其他mysql API的讲解,是一个很好的学习网站。
先给出一个测试代码,起名为mymysql.cpp。这个代码也是从网上拷贝的,具体从哪也忘了,反正就是mysql_real_connect函数的简单使用,目的就是测试能不能通过该函数与MySQL数据库引擎建立连接。
#include <iostream>
#include <mysql/mysql.h>
#include <string>
#include <assert.h>
int main()
{
MYSQL *ms_conn = mysql_init(NULL);
if (ms_conn == NULL)
{
std::cout << "Error: mysql_init failed." << std::endl;
return 0;
}
std::cout << "Info: mysql_init successful." << std::endl;
MYSQL *ms_res = NULL;
ms_res = mysql_real_connect(ms_conn, "localhost", "root", "111111",
"dsf", 3306, NULL, CLIENT_FOUND_ROWS);
if (ms_res == NULL)
{
std::cout << "Error: connect mysql failed: " << mysql_error(ms_conn) << std::endl;
mysql_close(ms_conn), ms_conn = NULL;
return 0;
}
std::cout << "Info: mysql connect successful." << std::endl;
// ... // 其他操作
// 使用完释放系统资源
mysql_close(ms_conn), ms_conn = NULL;
return 0;
}
编译:
g++ -o mymysql mymysql.cpp -I /usr/include/mysql/ -lmysqlclient
如果执行./mymysql后发现能够与MySQL数据库引擎建立连接,那下面的操作就不用做了。
如果出现
Error: connect mysql failed: Access denied for user 'root'@'localhost'
这个错误,说明需要执行一些操作。
1.打开mysql的配置文件
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
(1)里面的 bind-address = 127.0.0.1 这一行是不能注释的(默认就是不注释),注释了代表要远程登录,不注释就是本地访问。
(2)在末尾添加
skip-grant-tables
此行代码的作用是登录mysql不用输入root密码,这一步可能就是mysql_real_connect成功执行的关键。
2.使用命令进入mysql中,给权限
GRANT ALL PRIVILEGES ON *.* TO root@localhost IDENTIFIED BY "111111";
其中root@localhos
,localhost
就是本地访问;第二个'123456'
为你给新增权限用户设置的密码。
如果第一步执行后,能够成功使用mysql_real_connect函数,第二步就不用做了。
3.重启mysql
service mysql restart
最后结果: