【MySQL】:C/C++链接

一.前置工作

进行C/C++链接时我们需要第三方库,但实际上在我们安装MySQL时就已经安装了,如果没有安装下面可以再执行该命令进行更新(安装)。

在这里插入图片描述

可以查看自己是否安装。

在这里插入图片描述

简单测试

以下函数是帮助获取mysql版本号的

在这里插入图片描述

由于是链接外部库,所以在编译时需要告诉编译器库的位置,如果不了解可以看我的博客基础静动态库部分。

在这里插入图片描述

在这里插入图片描述

如果它告诉你库找不到,那么就表明链接出错,找准库的位置,或者建立软链接到lib64目录下,具体操作可以看我的软硬链接部分(参考案例:Boost索引的建立,倒排索引部分,引入了jieba库,这里就建立了软链接,以方便我们使用)。这里不用手动连接头文件,是因为头文件本身我们就放在uer/include里,如果你没有,也记得手动连接。

二.官方手册

进入mysql官网。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

可以在这里选择需要的函数。

在这里插入图片描述

可以在这里查找封装的数据结构。

三.基本接口

1.初始化和关闭

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.进行连接

在这里插入图片描述

1.host:连接的主机
2.user:连接的对象(用户)
3.passwd:密码
4.db:连接的库
5.port:端口号(我个人的端口号是3306)
6.unix_socket:预先套接(直接设为nullptr即可)
7.client_flag:设置为0即可

在这里插入图片描述

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

3.下达命令

在这里插入图片描述

1.SQL对象
2.下达的指令

为了测试,我们在库里建张表。

在这里插入图片描述

向表内进行插入。

在这里插入图片描述

在插入时有个小技巧,如果输错了,不能直接删除,要按ctrl+删除。

在这里插入图片描述

可以看到成功插入,如果我们插入的是中文呢?

在这里插入图片描述

在这里插入图片描述

可以看到出现乱码了,很明显是编码不同造成的,我的mysql编码是UTF8,而客户端默认是latin1。所以在链接成功后,应当将客户端编码也改成UTF8。

在这里插入图片描述

4.获取执行结果

增删改都没什么问题,但问题是查呢

很明显直接使用select是不会进行返回的,那么我们该如何让它显示出来呢?

实际上,在执行查找指令后,它会把数据保存在MYSQL结构体内,需要我们自己提取。

在这里插入图片描述

使用该函数会把数据库里的数据存放到MYSQL_RES的结构体内。

在这里插入图片描述

MySQL内的表结构分为列属性和内容,我们读取出来的就是内容。简单来看,MYSQL_RES的结果就像是方阵。

在这里插入图片描述

1.获取行数

在这里插入图片描述

2.获取列数

在这里插入图片描述

测试

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.查询结果

想要得到结果,其实遍历方阵就行了,而mysql有专门的函数来干这件事。

在这里插入图片描述

这里的MYSQL_ROW其实就是一个char**类型,它会指向每一行,所以就可以一次得到一行的信息,简单来说可以看作二维数组指针。

在这里插入图片描述

在这里插入图片描述

4.获取列属性

在这里插入图片描述

属性有很多,所以MYSQL_FIELD实际上是一个结构体,下面我们只打印列名。

在这里插入图片描述

在这里插入图片描述

5.释放空间

MYSQL_RES实际上malloc了一片内存空间来存储查询过来的数据,所以我们一定要记的 free(result),不然是肯定会造成内存泄漏的.

在这里插入图片描述

在这里插入图片描述

另外,mysql C api还支持事务等常用操作,大家下来自行了解:

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);

四.测试源代码

#include<iostream>
#include<mysql/mysql.h>

const std::string host="127.0.0.1";
const std::string user="connector";
const std::string passwd="123456";
const std::string db="conn";
const unsigned int port=3306;

int main()
{
   

  //1.初始化
  MYSQL *my=mysql_init(nullptr);//MYSQL就是一个结构体
  if(nullptr==my)
  {
   
    std::cerr<<"init mysql error"<<std::endl;
    return 1;
  }

  //2.进行连接
  if(mysql_real_connect(my,host.c_str(),user.c_str(),passwd.c_str(),db.c_str(),port,nullptr,0)==nullptr)
  {
   
    std::cerr<<"connect MYSQL error"<<std::endl;
    return 2;
  }
  
  mysql_set_character_set(my,"utf8");//更改编码格式

  //3.下达指令
  //std::string sql="insert into user(name,age,telephone) values('张三',18,'1527282345')";//细节:可以不带分号
  //std::string sql="delete from user where id=3";//删除
  std::string sql="select * from user";//查询

  int n=mysql_query(my,sql.c_str());
  if(n==0) std::cout<<"Sucess"<<std::endl;
  else 
  {
   
    std::cout<<"Failed"<<std::endl;
    return 3;
  }

  //查询
  MYSQL_RES *res=mysql_store_result(my);
  if(nullptr==res)
  {
   
    std::cerr<<"mysql_store_result err"<<std::endl;
    return 4;
  }

  my_ulonglong rows=mysql_num_rows(res);
  my_ulonglong cols=mysql_num_fields(res);

  std::cout<<"rows:"<<rows<<std::endl;
  std::cout<<"cols:"<<cols<<std::endl;

  //属性
  MYSQL_FIELD*fields_arr=mysql_fetch_field(res);
  for(int i=0;i<cols;i++)
  {
   
    std::cout<<fields_arr[i].name<<' ';
  }
  std::cout<<'\n';

  //内容
  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]<<' ';
    }
    std::cout<<'\n';
  }

  mysql_free_result(res);//释放空间

  mysql_close(my);
  return 0;
}

相关推荐

  1. ArchLinux下载

    2024-02-19 16:34:04       64 阅读
  2. 创建软

    2024-02-19 16:34:04       53 阅读
  3. 编译和

    2024-02-19 16:34:04       54 阅读
  4. word导出

    2024-02-19 16:34:04       53 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-19 16:34:04       91 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-19 16:34:04       97 阅读
  3. 在Django里面运行非项目文件

    2024-02-19 16:34:04       78 阅读
  4. Python语言-面向对象

    2024-02-19 16:34:04       88 阅读

热门阅读

  1. 编程笔记 Golang基础 006 Goland开发环境搭建

    2024-02-19 16:34:04       64 阅读