前言

我的mysql版本是8.0.31。在linux中使用第三方库时首先需要安装库,然后在编译时指定链接库名,要注意的是这个库是放在/usr/lib64/mysql下的,所以需要在编译时指定动态库的路径,或者把/usr/lib64/mysql目录下的文件都拷贝到/usr/lib64中。我们先从mysql官网下载动态库进行安装,再用C语言连接mysql进行CRUD操作。


一、安装libmysqlclient

mysql官网:https://dev.mysql.com/
1、点击MySQL Downloads

2、点击C API。

3、点击linux那一行对应的MySQL Community Server

4、选择版本,centos第一栏选择Red Hat Enterprise,centos7第二栏就选 Linux7,如果是centos6 应该就算选Linux6;然后往下面翻,找到RPM Package, Development Libraries,点击下载,然后用xftp把下载好的文件上传到centos7中。或者是复制下载链接,在centos中用wget 链接 ,进行下载。


5、安装libmysqlclient: sudo rpm -ivh 包名。安装完成后在/usr/include/mysql中会有相关的头文件,/usr/lib64/mysql中有相关的库。到此就安装成功了。要注意的是这里的第三方库不是直接放在/usr/lib64目录下,所以如果不指定链接路径会提示找不到库,用-L路径名指定。

6、验证是否安装成功需要包含头文件 #include。
首先通过 mysql_get_client_info() 函数,来验证我们的引入是否成功,如果正确编译并输出mysql版本就表示成功引入。
代码如下(示例):

#includeint main(){printf("mysql client Version: %s\n", mysql_get_client_info());return 0;}

由于使用的是第三方库,在编译时一定要指定链接的库名,用-lmysqlclient指定。
gcc test.c -o test -L/usr/lib64/mysql -lmysqlclient

连接mysql进行操作

mysql官方文档:https://www.mysqlzh.com/api/17.html

必须先进行初始化,然后再进行连接

MYSQL * fm = mysql_init(NULL);

连接函数:

MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, //MYSQL 就是刚刚初始话的那个,host是mysql的IP,本机连接是127.0.0.1const char *user, //用户名const char *passwd, //密码const char *db,//连接的数据库名unsigned int port,//mysqld端口号,一般是3306const char *unix_socket,  //nullunsigned long clientflag);//默认填0函数不成功则返回NULL

mysql连接成功后默认是编码是Latin,因此要设置编码格式为UTF8,否则插入的数据会乱码。

mysql_set_character_set(fmp, "utf8");

增删查改都是使用mysql_query进行的,函数成功返回0。第一个参数就是初始化函数的返回值,第二个参数是要执行的sql语句。
增删改比较方便,判断返回值是不是0就知道是否成功。而查还需要在成功之后拿到查询的数据。

int mysql_query(MYSQL *mysql, const char *q);

获得查询结果:

mysql_store_result()函数malloc一个空间来存储查询的结果,并返回该空间的地址。由于是malloc出来的,所以用完后一定要配合mysql_free_result()释放空间,否则会造成内存泄漏。

MYSQL_RES * mysql_store_result(MYSQL *mysql);mysql_free_result(MYSQL_RES *res);

有下列与查询结果有关的函数

//获取行数my_ulonglong mysql_num_rows(MYSQL_RES  *res);//获取列数unsigned int mysql_num_fields(MYSQL_RES  *res)//获取每列名称MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res)//获取每行的结果MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);

我们可以根据根据列数先打印列名;再根据行数遍历每一行查询,根据列数遍历每列结果

int rows = mysql_num_rows(fm);int columns = mysql_num_fields(fm);MYSQL_FIELD *fields = mysql_fetch_fields(res);for(int i =0; i < colums; ++i){printf("%s\t",fields[j].name);}printf("\n");MYSQL_ROW line;//遍历结果for(int i = 0; i < rows; ++i){line = mysql_fetch_row(res);for(int j = 0; j < columns; ++j){printf("%s\t",line[j]);}printf("\n");} 

最后放一个我自己用c++和c写的实例

#include #include #include#include using std::cout;using std::endl;using std::string;const string host = "127.0.0.1";const string user = "xxxxx";const string password = "xxxxxxx";const string db = "personal";unsigned int port = 3306;int main(){   MYSQL *fmp = mysql_init(nullptr);   if (mysql_real_connect(fmp, host.c_str(), user.c_str(),                          password.c_str(), db.c_str(), port, nullptr, 0) == nullptr)   {      cout << "connect failed\n";      return 1;   }   cout << "connect successful\n";   mysql_set_character_set(fmp, "utf8");   //创建表   // string s = "create table emp if not exists(id int primary key, job varchar(16),salary decimal(6,2))";   // if(mysql_query(fmp,s.c_str()) != 0 )   // {   //    cout<<"query:"<<s<<"failed\n";   //    return 2;   // }//增   // string s = "insert into emp (id,job,salary) values (1,\'bob\',6000.00)";   // if (mysql_query(fmp, s.c_str()) != 0)   // {   //    cout << "query:" << s << "failed\n";   //    return 2;   // }   //改   // string s = "update emp set job=\'engineer\' where id = 1";   // if (mysql_query(fmp, s.c_str()) != 0)   // {   //    cout << "query:" << s << "failed\n";   //    return 3;   // }   string s = "select * from emp";   if (mysql_query(fmp, s.c_str()) != 0)   {      cout << "query:" << s << "failed\n";      return 3;   }      MYSQL_RES * res = mysql_store_result(fmp);   int columns = mysql_num_fields(res);   int rows = mysql_num_rows(res);   cout<<"行: "<<rows<<"列:"<<columns<<endl;   MYSQL_FIELD *fields = mysql_fetch_fields(res);   for(int i = 0; i < columns; ++i)   {      cout<<fields[i].name<<"\t";   }   cout<<endl;   MYSQL_ROW content;   for(int i = 0; i < rows; ++i)   {      content = mysql_fetch_row(res);      for(int j = 0; j < columns; ++j)      {         cout<<content[j]<<"\t";      }      cout<<endl;   }      mysql_free_result(res);   mysql_close(fmp);   return 0;}