Linux_MySQL C语言连接MySQL,部分操作函数(设置中文编码,增删查改)解析(动态库软链接)

16 篇文章 1 订阅
13 篇文章 10 订阅

这里采用连接外部库的方式,使用C语言连接MySQL

1.项目导入MySQL

建议先看一下Linux_动态库与静态库(制作与安装)

首先先看一下自己是否有MySQL的头文件和库,如果没有去官网下载一下

检查命令,检查头文件和库是否存在

find /usr/include/ -name mysql.h
find /usr/lib64/ -name libmysqlclient.*

在这里插入图片描述
C语言调用MySQL库的下载地址

下载好后将压缩包上传到Linux上(新建一个文件夹)
使用tar xzf 安装包名解压,并使用mv命令将解压后的文件重命名
在这里插入图片描述

这时新创建一个项目文件,创建测试文件
使用软链接命令链接我们刚才解压的头文件和库

ln -s ~/LibMySQL/mysql_lib/include include;
//~/LibMySQL/mysql_lib/include 是解压后头文件的路径
//include 是软链接名
ln -s ~/LibMySQL/mysql_lib/lib lib;

建立好后结果如下:
在这里插入图片描述
在这里插入图片描述
注意:链接了外部库的话Makefile 编译时需要指定
具体看Linux_动态库与静态库(制作与安装)

Makefile如下

MySQL:TestConnect.cpp
	g++ -o $@ $^ -std=c++11 -I./include -L./lib -lmysqlclient

.PHONY:clean

clean:
	rm -f MySQL

此时可以编译了,但是执行错误
在这里插入图片描述
发现动态库系统还是没有找到
还是在这片文章中介绍了原因和解决方法Linux_动态库与静态库(制作与安装)
在这里插入图片描述

这里选择文章中的第三种方法,创建文件,更新系统配置

 cd /etc/ld.so.conf.d/

创建一个配置文件
在这里插入图片描述

打开配置文件,将解压的动态库链接拷贝进去,我这里是

sudo vim 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

最后执行ldconfig即可
在这里插入图片描述
成功链接到动态库!!

测试代码如下:
在这里插入图片描述

#include<iostream>

#include "include/mysql.h"

int main(){
    std::cout<<"MySQL Connect Version"<<mysql_get_client_info()<<std::endl;
    return 0;
}

在这里插入图片描述成功打印出MySQL版本,使用软链接让C语言调用MySQL成功。

2.调用MySQL测试

初始化

MYSQL *mysql_init(MYSQL *mysql);
要使用库,必须先进行初始化

MySQL 连接函数

MYSQL *mysql_real_connect(MYSQL *mysql,---- MySQL句柄
const char *host, -----连接IP
const char *user, ----使用人
const char *passwd, -----对应密码
const char *db, ----- 连接的数据库
unsigned int port, ------MySQL端口
const char *unix_socket, -----远端给nullptr即可
unsigned long clientflag);----其他参数

void mysql_close(MYSQL *sock);—关闭MySQL连接

注意:数据库在默认情况下不认识中文,在插入,查询是遇到中文会出现乱码情况

在来连接成功后还需要设置编码格式utf-8

//设置MySQL编码格式
mysql_set_character_set(sql,"utf8");
#include<iostream>

#include "include/mysql.h"

int main(){
    //std::cout<<"MySQL Connect Version"<<mysql_get_client_info()<<std::endl;
    MYSQL*sql=mysql_init(nullptr);//创建MySQL句柄

    //连接数据库
    if(nullptr==mysql_real_connect(sql,"121.5.176.41","dodamce","这个用户的密码","dodamce_test",3306,nullptr,0)){
        std::cerr<<"MySQL Connect Error"<<std::endl;
        return 1;
    }
    std::cout<<"MySQL 连接成功"<<std::endl;
    //设置MySQL编码格式
    mysql_set_character_set(sql,"utf8");
    
    mysql_close(sql);//关闭数据库
    std::cout<<"MySQL Close"<<std::endl;
    return 0;
}

在这里插入图片描述
基本连接完成

在这里插入图片描述
这里要对这个数据库进行修改

下达MySQL增删改命令

修改数据库表:

下发mysql命令
int mysql_query(MYSQL *mysql, const char *q);

需要让MySQL执行那些命令就传入到q中

#include<iostream>
#include<string>

#include "include/mysql.h"

int main(){
    //std::cout<<"MySQL Connect Version"<<mysql_get_client_info()<<std::endl;
    MYSQL*sql=mysql_init(nullptr);//创建MySQL句柄

    //连接数据库
    if(nullptr==mysql_real_connect(sql,"121.5.176.41","dodamce","对应用户的密码","dodamce_test",3306,nullptr,0)){
        std::cerr<<"MySQL Connect Error"<<std::endl;
        return 1;
    }
    std::cout<<"MySQL 连接成功"<<std::endl;

    //设置MySQL编码格式
    mysql_set_character_set(sql,"utf8");

    std::string insert="insert into msg values(6,\'tom\',\'213\',now())";

    std::string modify="update msg set name=\'asd\' where id=3";

    std::string del="delete from msg where id=4";

    int ret=mysql_query(sql,insert.c_str());//通过mysql_query下方不同的命令

    std::cout<<"resault code"<<ret<<std::endl;

    mysql_close(sql);//关闭数据库
    std::cout<<"MySQL Close"<<std::endl;
    return 0;
}

在这里插入图片描述

调用MySQL查询数据

1. 通过mysql_store_result这个函数来读取结果
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 中的数据。

//1. 获取结果行数mysql_num_rows
 my_ulonglong mysql_num_rows(MYSQL_RES *res);
//2.获取结果列数mysql_num_fields
 unsigned int mysql_num_fields(MYSQL_RES *res);
//3.获取列名mysql_fetch_fields
 MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);
//4.获取结果内容mysql_fetch_row
 MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
/**
它会返回一个MYSQL_ROW变量,MYSQL_ROW其实就是char **,可以理解为二维数组
*/
#include<iostream>
#include<string>

#include "include/mysql.h"

int main(){
    //std::cout<<"MySQL Connect Version"<<mysql_get_client_info()<<std::endl;
    MYSQL*sql=mysql_init(nullptr);//创建MySQL句柄

    //连接数据库
    if(nullptr==mysql_real_connect(sql,"121.5.176.41","dodamce","对应用户的密码","dodamce_test",3306,nullptr,0)){
        std::cerr<<"MySQL Connect Error"<<std::endl;
        return 1;
    }
    std::cout<<"MySQL 连接成功"<<std::endl;

    //设置MySQL编码格式
    mysql_set_character_set(sql,"utf8");

    std::string insert="insert into msg values(6,\'tom\',\'213\',now())";

    std::string modify="update msg set name=\'asd\' where id=3";

    std::string del="delete from msg where id=4";

    std::string find="select * from msg";

    int ret=mysql_query(sql,find.c_str());//通过mysql_query下方不同的命令

    if(ret!=0){
        std::cerr<<"find error"<<std::endl;
    }

    MYSQL_RES* res=mysql_store_result(sql);

    int rows=mysql_num_rows(res);//获取查询结果行数
    int cols=mysql_num_fields(res);//获取查询结果列数

    for(int i=0;i<rows;i++){
        MYSQL_ROW row=mysql_fetch_row(res);//获取查询结果一行的数据
        for(int j=0;j<cols;j++){
            std::cout<<row[j]<<"\t";
        }
        std::cout<<std::endl;
    }

    free(res);//不要忘记释放空间

    mysql_close(sql);//关闭数据库
    std::cout<<"MySQL Close"<<std::endl;
    return 0;
}

在这里插入图片描述

//获取MySQL所有列属性
MYSQL_FIELD*mysql_fetch_field(MYSQL_RES*);
#include<iostream>
#include<string>

#include "include/mysql.h"

int main(){
    //std::cout<<"MySQL Connect Version"<<mysql_get_client_info()<<std::endl;
    MYSQL*sql=mysql_init(nullptr);//创建MySQL句柄

    //连接数据库
    if(nullptr==mysql_real_connect(sql,"121.5.176.41","dodamce","对应用户的密码","dodamce_test",3306,nullptr,0)){
        std::cerr<<"MySQL Connect Error"<<std::endl;
        return 1;
    }
    std::cout<<"MySQL 连接成功"<<std::endl;

    //设置MySQL编码格式
    mysql_set_character_set(sql,"utf8");

    std::string insert="insert into msg values(6,\'tom\',\'213\',now())";

    std::string modify="update msg set name=\'asd\' where id=3";

    std::string del="delete from msg where id=4";

    std::string find="select * from msg";

    int ret=mysql_query(sql,find.c_str());//通过mysql_query下方不同的命令

    if(ret!=0){
        std::cerr<<"find error"<<std::endl;
    }

    MYSQL_RES* res=mysql_store_result(sql);

    int rows=mysql_num_rows(res);//获取查询结果行数
    int cols=mysql_num_fields(res);//获取查询结果列数

    MYSQL_FIELD* file=mysql_fetch_field(res);//获取列信息
    for(int i=0;i<cols;i++){
        //获取列名称
        std::cout<<file[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<cols;j++){
            std::cout<<row[j]<<"\t";
        }
        std::cout<<std::endl;
    }

    free(res);//不要忘记释放空间

    mysql_close(sql);//关闭数据库
    std::cout<<"MySQL Close"<<std::endl;
    return 0;
}

在这里插入图片描述

事务等其他操作

my_bool STDCALL mysql_autocommit(MYSQL * mysql, my_bool auto_mode); 
my_bool STDCALL mysql_commit(MYSQL * mysql); 
my_bool STDCALL mysql_rollback(MYSQL * mysql);
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NUC_Dodamce

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值