
做一下准备工作。
我们创建了需要的用户和数据库,接下来我们需要下载mysql链接c语言的库。
apt install libmysqlclient-dev -y 通过这个语句安装一下我们就可以使用了。
就在这个目录下的mysql.h中。

连上服务器只要这个代码能跑就没问题。
认识常用接口
要使用库,必须先进行初始化!
MYSQL *mysql_init(MYSQL *mysql);
如: MYSQL *mfp = mysql_init(NULL)
链接数据库mysql_real_connect
初始化完毕之后,必须先链接数据库,在进行后续操作。(mysql网络部分是基于TCP/IP的).
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);
第一个参数 MYSQL是 C api中一个非常重要的变量(mysql_init的返回值),里面内存非常丰富,有 port,dbname,charset等连接基本参数。它也包含了一个叫 st_mysql_methods的结构体变量,该变量 里面保存着很多函数指针,这些函数指针将会在数据库连接成功以后的各种数据操作中被调用。
mysql_real_connect函数中各参数,基本都是顾名思意。

下发mysql命令mysql_query
int mysql_query(MYSQL *mysql, const char *q);这个函数的作用就是让我们的sql语句生效的,可以参考着看下面的代码,很简单。
返回值:mysql_query 成功 = 0,失败 = 非 0!

但是此时还存在一个问题,就是我们插入中文的时候存在乱码问题。
//建立好链接之后,获取英文没有问题,如果获取中文是乱码:
//设置链接的默认字符集是utf8,原始默认是latin1
mysql_set_character_set(myfd, "utf8");
增删改做起来很简单,我们下面来看看查找是怎么回事。
其实我们查到的结果是存在在缓冲区当中的,我们只需要把它取出来就行了,我们要使用下面这个函数。
MYSQL_RES *mysql_store_result(MYSQL *mysql);
该函数会调用MYSQL变量中的st_mysql_methods中的 read_rows 函数指针来获取查询的结果。同时该 函数会返回MYSQL_RES 这样一个变量,该变量主要用于保存查询的结果。同时该函数malloc了一片内 存空间来存储查询过来的数据,所以我们一定要记的 free(result),不然是肯定会造成内存泄漏的。 执行 完mysql_store_result以后,其实数据都已经在MYSQL_RES 变量中了,下面的api基本就是读取MYSQL_RES 中的数据。


我们的查到的数据右边是真是查到的数据信息,肯定是存在在内存中的,方便我们理解,我们认为它是存放在一个数组中,这个数组每个元素都是一个二级指针,此时每个元素信息都是一个字符串char *,此时我们就存放了这些数据。
获取结果行数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_fetch_row
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
它会返回一个MYSQL_ROW变量,MYSQL_ROW其实就是char **.就当成一个二维数组来用吧。可以理解为每次给我们返回该位置指向的内容,比如第一次调用就给我们返回第一个char** 所指向的这个数组,就是该行数据的指针,通过列数通过for循环去访问。
int fields = mysql_num_fields(res);
i = 0;
MYSQL_ROW line;
for(; i < nums; i++){
line = mysql_fetch_row(res);
int j = 0;
for(; j < fields; j++){
cout<<line[j]<<" ";
}
cout<<endl;
}就像这个样子。


此时我们就通过了C语言程序拿到我们的数据库中的结果了。
此时我们发现没有列名称,就要用到上面一个函数了。

就是这个,先把列属性给打印出来,可以理解为这个函数把指向列的那一行的指针给你了,此时你通过拿到列数,然后把这些列的name属性给打印出来即可。