首先要保证下载好mysql的库和头文件,头文件在/usr/include/mysql/目录下,库在/usr/lib64/mysql/目录下:
一般情况下,在我们安装mysql的时候,这些都提前配置好了,如果没有就重装一下mysql。如果重装mysql还是没有就再装一下mysql-devel:
yum install -y mysql-devel;
这些都准备好之后,就可以开始在c语言中使用mysql了!
初始化mysql
头文件包含<mysql/mysql.h>
参数传nullptr即可
接口的返回值MYSQL*是一个结构体指针,包含很多mysql的属性,这个值在后面许多接口中都要作为参数传递,所以很重要!如果初始化mysql失败就会返回nullptr
初始化mysql一定会申请空间,所以每次使用完mysql都要手动释放空间:
连接mysql
这个接口参数较多,但都是在登陆mysql的信息:
第一个参数就是初始化mysql的返回值
第二个参数是登录的主机或ip
第三个参数是登录用户
第四个参数是密码
第五个参数是要使用的数据库
第六个参数是mysqld运行的端口号,一般是3306,可以在/etc/my.cnf中设置
第七个参数一般传nullptr,第八个参数一般传0
如果连接成功,返回值与第一个参数相同;如果连接失败,返回空指针
设置字符集
如果我们要插入的数据是中文,客户端使用的字符集和服务端不同,就会出现乱码的问题。
成功返回0,不成功返回非0
发送mysql命令
第二个参数是mysql的命令,命令末尾可以不带 ;
成功返回0,不成功返回非0
对于create,insert,delete,update,drop等命令,执行后不需要返回数据,所以直接调用这个接口即可;但是对于select命令,需要返回数据,就需要其他接口配合使用了
获取数据——mysql_store_result
这个接口可以获取读取结果,MYSQL结构体中有数据的缓冲区,这个接口就是将其缓冲区的数据放到MYSQL_RES结构体中。
创建MYSQL_RES结构体也需要分配空间,使用结束后需要回收:
从MYSQL_RES中获取数据的行数——mysql_num_rows
从MYSQL_RES中获取数据的列数——mysql_num_fields
从MYSQL_RES中获取列名——mysql_fetch_fields
这个接口的参数是上一个接口的返回值。
返回值是所有列的结构体的数组,列的结构体是存储列属性的,其中有一个name对象就是列的名称。
从MYSQL_RES中获取单行数据——mysql_fetch_row
可以将一行数据的多个列想象成多个char*类型的数据,那么这个MYSQL_ROW就是char**,只需像数组一样即可访问行数据。
将上面四个接口的返回值配合循环的使用就可以打印出select数据的结果了。
例子
#include <iostream>
#include <mysql/mysql.h>
using namespace std;
int main()
{
//初始化mysql
MYSQL* my = mysql_init(nullptr);
if(my == nullptr)
{
cout << "init fail" << endl;
return 1;
}
//连接mysql
my = mysql_real_connect(my, "127.0.0.1", "ly", "123123", "test1", 3306, nullptr, 0);
if(my == nullptr)
{
cout << "connect fail" << endl;
return 2;
}
//设置字符集
mysql_set_character_set(my, "utf8");
//发出命令
if(mysql_query(my, "create table info(id int primary key, name varchar(32), phone_num char(11) unique)"))
{
cout << "create fail" << endl;
}
if(mysql_query(my, "insert into info (id, name, phone_num) values (1, 'Tom', '12345678999')"))
{
cout << "insert fail" << endl;
}
if(mysql_query(my, "insert into info (id, name, phone_num) values (2, 'Peter', '12345678911')"))
{
cout << "insert fail" << endl;
}
// if(mysql_query(my, "drop table info"))
// {
// cout << "insert fail" << endl;
// }
if(mysql_query(my, "select * from info"))
{
cout << "select fail" << endl;
}
MYSQL_RES* res = mysql_store_result(my);
MYSQL_FIELD* colname = mysql_fetch_fields(res);
int row = mysql_num_rows(res);
int col = mysql_num_fields(res);
//打印列名
for(int i = 0; i < col; i++)
{
cout << colname[i].name << '\t';
}
cout << endl;
//打印数据
for(int i = 0; i < row; i++)
{
MYSQL_ROW rowdata = mysql_fetch_row(res);
for(int j = 0; j < col; j++)
{
cout << rowdata[j] << '\t';
}
cout << endl;
}
//回收数据结构体
mysql_free_result(res);
//回收mysql
mysql_close(my);
}
编译代码时必须说明库的路径,给出库名,在编译命令加上如下选项:
-L /usr/lib64/mysql -lmysqlclient;