如何使用C/C++链接mysql数据库
一、安装数据库
安装我们要使用的数据库有两种方法
- 手动安装包导入
在数据库的官网找到对应版本的安装包,然后导入自己的系统库中去,在项目需要时用include包一下头库文件即可 - 直接用系统指令下载
以Ubantu20.04举例
sudo apt install -y libmysqlclient-dev
这样我们的库中就将mysql安装包下载好了,在使用时如果报错记得在编译时包一下头文件和库文件的路径
例如:
g++ -o $@ $^ -I./include -L./lib -lmysqlclient
如果找不到可以使用下面的指令,可以找出这个库安装的所有文件的路径
dpkg -L libmysqlclient-dev

include 包含所有的方法声明, lib 包含所有的方法实现(打包成库)
二、接口使用
1.初始化
使用库之前先初始化
MYSQL *mysql_init(MYSQL *mysql);
例:
//1.初始化
if(my==nullptr)
{
std::cerr<<"init error"<<std::endl;
return 1;
}2.链接
初始化完毕之后,必须先链接数据库,在进行后续操作
MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long clientflag);
举例:
//2.连接
if(mysql_real_connect(my,host.c_str(),user.c_str(),password.c_str(),db.c_str(),port,nullptr,0)==nullptr)
{
std::cerr<<"connect error"<<std::endl;
return 2;
}
如果发现自己数据出现乱码的情况,可能是编码没有将编码没有设置好
默认是latin,可以显示英文,但要显示中文需将默认字符集改为utf_8
mysql_set_character_set(myfd, "utf8");
3.执行mysql命令
int mysql_query(MYSQL *mysql, const char *q);
第一个参数为初始化的返回值,第二个参数为要执行的sql语句,如“select * from table”
//3.命令
std::string sql="select * from users";
int n=mysql_query(my,sql.c_str());
if(n==0)
{
std::cout<<"query "<<sql<<" success"<<std::endl;
}
else
{
std::cerr<<"query "<<sql<<" error"<<std::endl;
return 3;
}
到这里如果我们执行的是增删改等修改操作的话,就已经成功执行了,但如果是要执行查找等需要查看结果的SQL语句,我们就还需要通过一个接口来获取查找的数据
4.查看执行结果数据
MYSQL_RES *mysql_store_result(MYSQL *mysql);
MYSQL_RES* res = mysql_store_result(my);
该函数会调用MYSQL变量中的st_mysql_methods中的 read_rows 函数指针来获取查询的结果。
同时该函数会返回MYSQL_RES 这样一个变量,该变量主要用于保存查询的结果,同时malloc了一片内存空间来存储查询过来的数据,所以我们一定要记的 free(result),不然是肯定会造成内存泄漏的。
执行完mysql_store_result以后,其实数据都已经在MYSQL_RES 变量中了,下面的api就是来读取MYSQL_RES 中的数据。
- 获取结果行数mysql_num_rows
my_ulonglong mysql_num_rows(MYSQL_RES *res);
- 获取结果列数mysql_num_fields
unsigned int mysql_num_fields(MYSQL_RES *res);
- 获取列名mysql_fetch_fields
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);
- 获取列名属性
//属性
MYSQL_FIELD *fields_array = mysql_fetch_fields(res);
for(int i=0;i<fields;i++)
{
std::cout<<fields_array[i].name<<"\t";
}
std::cout<<std::endl;

- 获取数据
//数据
for(int i=0;i<rows;i++)
{
MYSQL_ROW row = mysql_fetch_row(res);
for(int j=0;j<fields;j++)
{
std::cout<<row[j]<<"\t";
}
std::cout<<std::endl;
}

5.释放空间,关闭mysql链接
// 释放结果空间 mysql_free_result(res); // 关闭mysql连接 mysql_close(my);
相关文章
MySQL中文汉字转拼音的自定义函数和使用实例(首字的首字母)
这篇文章主要介绍了MySQL中文汉字转拼音的自定义函数和使用实例,需要的朋友可以参考下2014-06-06
mysql自动定时备份数据库的最佳方法(windows服务器)
网上有很多关于window下Mysql自动备份的方法,可是真的能用的也没有几个,有些说的还非常的复杂,难以操作,这里脚本之家小编为大家分享与整理了几个软件方便大家使用2016-11-11
MySQL中使用SHOW PROFILE命令分析性能的用法整理
这篇文章主要介绍了MySQL中使用show profile命令分析性能的用法整理,show profiles是数据库性能优化的常用命令,需要的朋友可以参考下2015-11-11
mysql优化的重要参数 key_buffer_size table_cache
MySQL服务器端的参数有很多,但是对于大多数初学者来说,众多的参数往往使得我们不知所措,但是哪些参数是需要我们调整的,哪些对服务器的性能影响最大呢2016-05-05
MySQL 中的行锁(Record Lock) 和 间隙锁(Gap Lock)详解
InnoDB中的行锁(RecordLock)和间隙锁(GapLock)是用于保证事务隔离性的两种锁机制,本文给大家介绍MySQL中的行锁(Record Lock) 和间隙锁(Gap Lock),感兴趣的朋友跟随小编一起看看吧2025-11-11


最新评论