[MySQL][访问 -- 使用C API连接]详细讲解

目录

  • 0.如何下载库?
  • [1.Connector/C 使用](#1.Connector/C 使用)
  • 2.MYSQL接口介绍
    • 0.MYSQL结构体
    • [1.初始化 -- mysql_init()](#1.初始化 -- mysql_init())
    • [2.链接数据库 -- mysql_real_connect()](#2.链接数据库 -- mysql_real_connect())
    • [3.下发MYSQL命令 -- mysql_query()](#3.下发MYSQL命令 -- mysql_query())
    • [4.获取执行结果 -- mysql_store_result()](#4.获取执行结果 -- mysql_store_result())
    • [5.获取结果行数 -- mysql_num_rows()](#5.获取结果行数 -- mysql_num_rows())
    • [6.获取结果列数 -- mysql_num_fields](#6.获取结果列数 -- mysql_num_fields)
    • 7.获取列名mysql_fetch_fields
    • [8.获取结果内容 -- mysql_fetch_row](#8.获取结果内容 -- mysql_fetch_row)
    • [9.关闭MYSQL链接 -- mysql_close()](#9.关闭MYSQL链接 -- mysql_close())
    • 10.补充
  • 3.图形化界面推荐

0.如何下载库?

  • 要使用C语言连接MYSQL,需要使用MYSQL官网提供的库,可以去官网下载
  • 也可以通过yum(Centos)或者apt(Ubuntu)直接安装mysql-devel

1.Connector/C 使用

  • 下载的库格式如下:

    • include 包含所有的方法声明

    • lib 包含所有的方法实现(打包成库)

      .
      ├── include
      │ ├── big_endian.h
      │ ├── byte_order_generic.h
      │ ├── byte_order_generic_x86.h
      │ ├── decimal.h
      │ ├── errmsg.h
      │ ├── keycache.h
      │ ├── little_endian.h
      │ ├── m_ctype.h
      │ ├── m_string.h
      │ ├── my_alloc.h
      │ ├── my_byteorder.h
      │ ├── my_compiler.h
      │ ├── my_config.h
      │ ├── my_dbug.h
      │ ├── my_dir.h
      │ ├── my_getopt.h
      │ ├── my_global.h
      │ ├── my_list.h
      │ ├── my_pthread.h
      │ ├── mysql
      │ │ ├── client_authentication.h
      │ │ ├── client_plugin.h
      │ │ ├── client_plugin.h.pp
      │ │ ├── get_password.h
      │ │ ├── plugin_auth_common.h
      │ │ ├── plugin_trace.h
      │ │ ├── psi
      │ │ │ ├── mysql_file.h
      │ │ │ ├── mysql_idle.h
      │ │ │ ├── mysql_mdl.h
      │ │ │ ├── mysql_memory.h
      │ │ │ ├── mysql_ps.h
      │ │ │ ├── mysql_socket.h
      │ │ │ ├── mysql_sp.h
      │ │ │ ├── mysql_stage.h
      │ │ │ ├── mysql_statement.h
      │ │ │ ├── mysql_table.h
      │ │ │ ├── mysql_thread.h
      │ │ │ ├── mysql_transaction.h
      │ │ │ ├── psi_base.h
      │ │ │ ├── psi.h
      │ │ │ └── psi_memory.h
      │ │ ├── service_my_snprintf.h
      │ │ └── service_mysql_alloc.h
      │ ├── mysql_com.h
      │ ├── mysql_com_server.h
      │ ├── mysqld_ername.h
      │ ├── mysqld_error.h
      │ ├── mysql_embed.h
      │ ├── mysql.h
      │ ├── mysql_time.h
      │ ├── mysql_version.h
      │ ├── my_sys.h
      │ ├── my_xml.h
      │ ├── sql_common.h
      │ ├── sql_state.h
      │ ├── sslopt-case.h
      │ ├── sslopt-longopts.h
      │ ├── sslopt-vars.h
      │ └── typelib.h
      └── lib
      ├── libmysqlclient.a
      ├── libmysqlclient_r.a -> libmysqlclient.a
      ├── libmysqlclient_r.so -> libmysqlclient.so
      ├── libmysqlclient_r.so.18 -> libmysqlclient.so.18
      ├── libmysqlclient_r.so.18.3.0 -> libmysqlclient.so.18.3.0
      ├── libmysqlclient.so -> libmysqlclient.so.18
      ├── libmysqlclient.so.18 -> libmysqlclient.so.18.3.0
      └── libmysqlclient.so.18.3.0

  • 尝试链接mysql client

    • 通过 mysql_get_client_info() 函数,来验证引入是否成功[在C/CPP代码中引入,编译,运行]

2.MYSQL接口介绍

0.MYSQL结构体

  • C API中一个非常重要的变量(mysql_init的返回值)
  • 里面内存非常丰富,有 port,dbname,charset等连接基本参数
  • 它也包含了一个叫st_mysql_methods的结构体变量,该变量里面保存着很多函数指针,这些函数指针将会在数据库连接成功以后的各种数据操作中被调用

1.初始化 -- mysql_init()

  • 要使用库,必须先进行初始化!
  • 函数原型:MYSQL *mysql_init(MYSQL *mysql);
  • 示例MYSQL *my = mysql_init(NULL)

2.链接数据库 -- mysql_real_connect()

  • 初始化完毕之后,必须先链接数据库,再进行后续操作(mysql网络部分是基于TCP/IP的)

  • 函数原型:

    cpp 复制代码
    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);
  • 建立好链接之后,获取英文没有问题,如果获取中文是乱码

    • 设置链接的默认字符集是utf8,原始默认是latin1
    • mysql_set_character_set(myfd, "utf8");

3.下发MYSQL命令 -- mysql_query()

  • 函数原型:int mysql_query(MYSQL *mysql, const char *q);
  • 参数q :要执行的sql语句,如"select * from table"

4.获取执行结果 -- mysql_store_result()

  • SQL执行完以后
    • 如果是update,insert等语句,那么就看下操作成功与否即可
    • 如果是查询语句,当然还要读取数据
      • 如果mysql_query返回成功,那么就通过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 中的数据

5.获取结果行数 -- mysql_num_rows()

  • 函数原型:my_ulonglong mysql_num_rows(MYSQL_RES *res);

6.获取结果列数 -- mysql_num_fields

  • 函数原型:unsigned int mysql_num_fields(MYSQL_RES *res);

7.获取列名mysql_fetch_fields

  • 函数原型:MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);

  • 示例:

    cpp 复制代码
    int fields = mysql_num_fields(res);
    MYSQL_FIELD *field = mysql_fetch_fields(res);
    
    for (int i = 0; i < fields; i++)
    {
        cout << field[i].name << " ";
    }
    cout << endl;

8.获取结果内容 -- mysql_fetch_row

  • 函数原型:MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);

  • 功能 :它会返回一个MYSQL_ROW变量,MYSQL_ROW其实就是char**,姑且可以当成是一个二维数组

    • 实际用起来类似于C++中的迭代器
  • 示例:

    mysql 复制代码
    MYSQL_ROW line;
    
    for (int i = 0; i < nums; i++)
    {
        line = mysql_fetch_row(res);
    
        for (int j = 0; j < fields; j++)
        {
            cout << line[j] << "\t";
        }
        cout << endl;
    }

9.关闭MYSQL链接 -- mysql_close()

  • 函数原型:void mysql_close(MYSQL *sock);

10.补充

  • 另外,MYSQL C API还支持事务等常用操作,可自行了解:

    cpp 复制代码
    y_bool STDCALL mysql_autocommit(MYSQL * mysql, my_bool auto_mode);
    my_bool STDCALL mysql_commit(MYSQL * mysql);
    my_bool STDCALL mysql_rollback(MYSQL * mysql);

3.图形化界面推荐

  • Navicat
  • SQLyog
  • MYSQL Workbench
相关推荐
islandzzzz33 分钟前
三表查询SQL怎么写?----小白初学+案例引入
数据库
whoarethenext35 分钟前
使用 C/C++ 和 OpenCV 实现滑动条控制图像旋转
c语言·c++·opencv
卡布奇诺-海晨1 小时前
MySQL的MVCC机制
数据库·mysql
hao_wujing2 小时前
攻击模型的恶意行为检测
网络·数据库·php
秃头摸鱼侠3 小时前
MySQL查询语句(续)
数据库·mysql
MuYiLuck3 小时前
【redis实战篇】第八天
数据库·redis·缓存
睡觉待开机3 小时前
6. MySQL基本查询
数据库·mysql
陳麦冬3 小时前
深入理解指针(二)
c语言·学习
大熊猫侯佩3 小时前
由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(三)
数据库·swiftui·swift
大熊猫侯佩3 小时前
由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(二)
数据库·swiftui·swift