前言
我的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;}