深入探索MySQL C API:使用C语言操作MySQL数据库

目录

引言

[一. MySQL C API简介](#一. MySQL C API简介)

[二. MySQL C API核心函数](#二. MySQL C API核心函数)

[2.1 初始化和连接](#2.1 初始化和连接)

[2.2 配置和执行](#2.2 配置和执行)

[2.3 处理结果](#2.3 处理结果)

[2.4 清理和关闭](#2.4 清理和关闭)

[2.5 错误处理](#2.5 错误处理)

[三. MySQL使用过程](#三. MySQL使用过程)

[四. 实现CRUD操作](#四. 实现CRUD操作)

[4.1 创建数据库并建立表](#4.1 创建数据库并建立表)

​编辑

[4.2 添加数据(Create)](#4.2 添加数据(Create))

​编辑

​编辑

[​编辑4.3 修改数据(Update)](#编辑4.3 修改数据(Update))

​编辑

[4.4 删除数据(Delete)](#4.4 删除数据(Delete))

[4.5 查询数据(Retrieve)](#4.5 查询数据(Retrieve))

结语


引言

在软件开发中,数据库是存储、检索和操作数据的关键组件。MySQL作为一种广泛使用的数据库系统,提供了丰富的API接口,允许开发者通过不同的编程语言与其交互。本文将详细介绍如何使用MySQL的C语言API来实现数据库的基本增删改查(CRUD)操作。

一. MySQL C API简介

MySQL C API是一组函数,它们提供了对MySQL服务器的底层访问。通过这个API,开发者可以在C语言程序中执行SQL语句并处理结果。

二. MySQL C API核心函数

cpp 复制代码
// Mysql操作句柄初始化
MYSQL *mysql_init(MYSQL *mysql);
// 参数为空则动态申请句柄空间进⾏初始化
//  失败返回NULL

// 连接mysql服务器
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 client_flag);
// mysql--初始化完成的句柄
// host---连接的mysql服务器的地址
// user---连接的服务器的⽤⼾名
// passwd-连接的服务器的密码
// db ----默认选择的数据库名称
// port---连接的服务器的端⼝: 默认0是3306端⼝
// unix_socket---通信管道⽂件或者socket⽂件,通常置NULL
// client_flag---客⼾端标志位,通常置0
// 返回值:成功返回句柄,失败返回NULL

// 设置当前客⼾端的字符集
int mysql_set_character_set(MYSQL *mysql, const char *csname)
    // mysql--初始化完成的句柄
    // csname--字符集名称,通常:"utf8"
    // 返回值:成功返回0, 失败返回⾮0;

// 选择操作的数据库
int mysql_select_db(MYSQL *mysql, const char *db)
    // mysql--初始化完成的句柄
    // db-----要切换选择的数据库名称
    // 返回值:成功返回0, 失败返回⾮0;

// 执⾏sql语句
int mysql_query(MYSQL *mysql, const char *stmt_str)
    // mysql--初始化完成的句柄
    // stmt_str--要执⾏的sql语句
    // 返回值:成功返回0, 失败返回⾮0;

// 保存查询结果到本地
MYSQL_RES *mysql_store_result(MYSQL *mysql)
    // mysql--初始化完成的句柄
    // 返回值:成功返回结果集的指针, 失败返回NULL;

// 获取结果集中的⾏数与列数
uint64_t mysql_num_rows(MYSQL_RES *result);
    //result--保存到本地的结果集地址
    // 返回值:结果集中数据的条数;

// 获取结果中列的个数
unsigned int mysql_num_fields(MYSQL_RES *result)
    // result--保存到本地的结果集地址
    // 返回值:结果集中每⼀条数据的列数;

// 遍历结果集
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
    // result--保存到本地的结果集地址
    // 返回值:实际上是⼀个char **的指针,将每⼀条数据做成了字符串指针数组 row[0]-第0列row[1] -第1列
    // 并且这个接⼝会保存当前读取结果位置,每次获取的都是下⼀条数据

// 释放结果集
void mysql_free_result(MYSQL_RES *result)
    // result--保存到本地的结果集地址
    // 返回值:void

// 关闭数据库客⼾端连接,销毁句柄:
void mysql_close(MYSQL *mysql)

// 获取mysql接⼝执⾏错误原因
const char *mysql_error(MYSQL *mysql)

2.1 初始化和连接

  • mysql_init:初始化MySQL操作句柄。
  • mysql_real_connect:使用给定的参数连接到MySQL服务器。

2.2 配置和执行

  • mysql_set_character_set:设置客户端字符集。
  • mysql_select_db:选择要操作的数据库。
  • mysql_query:执行SQL语句。

2.3 处理结果

  • mysql_store_result:保存查询结果到本地。
  • mysql_num_rowsmysql_num_fields:获取结果集中的行数和列数。
  • mysql_fetch_row:遍历结果集,获取单行数据。

2.4 清理和关闭

  • mysql_free_result:释放结果集资源。
  • mysql_close:关闭数据库连接,销毁句柄。

2.5 错误处理

  • mysql_error:获取MySQL接口执行错误原因。

三. MySQL使用过程

  • 初始化MySQL句柄

    • 使用mysql_init函数初始化一个MySQL连接句柄,为后续操作做准备。
  • 连接到MySQL服务器

    • 使用mysql_real_connect函数连接到MySQL服务器,需要提供主机地址、用户名、密码、数据库名等信息。
  • 设置字符集

    • 使用mysql_set_character_set设置客户端字符集,以确保字符编码的一致性。
  • 执行SQL语句

    • 使用mysql_query执行SQL语句,可以是查询、插入、更新或删除等操作。
  • 处理查询结果(对于查询操作):

    • 如果执行的是查询操作,可以使用mysql_store_result保存结果集,然后通过mysql_fetch_row逐行读取数据。
  • 错误处理

    • 在每个步骤中,如果操作失败,可以使用mysql_error获取错误信息。
  • 清理资源

    • 使用完MySQL句柄后,使用mysql_free_result释放结果集资源(如果有查询操作),然后使用mysql_close关闭连接,释放句柄资源。
  • 关闭连接

    • 最后,关闭与MySQL服务器的连接,清理分配的资源。

四. 实现CRUD操作

4.1 创建数据库并建立表

cpp 复制代码
create database if not exists test_db;
use test_db;
create table if not exists test_tb(
 id int primary key auto_increment,
 age int,
 name varchar(32),
 score decimal(4, 2)
);

4.2 添加数据(Create)

使用insert语句向数据库表中添加新记录。

cpp 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <mysql/mysql.h>
#define HOST "127.0.0.1"
#define USER "root"
#define PASSWD "mima"
#define DBNAME "test_db"
void add(MYSQL *mysql)
{
    char *sql = "insert into test_tb values(null, 18, '张三', 88.88), (null, 17, '李四', 77);";
    int ret = mysql_query(mysql, sql);
    if (ret != 0)
    {
        printf("mysql query error:%s\n", mysql_error(mysql));
        return;
    }
    return;
}

int main()
{
    MYSQL *mysql = mysql_init(NULL);
    if (mysql == NULL)
    {
        printf("init mysql handle failed!\n");
        return -1;
    }
    if (mysql_real_connect(mysql, HOST, USER, PASSWD, DBNAME, 0, NULL, 0) ==
        NULL)
    {
        printf("mysql connect error:%s\n", mysql_error(mysql));
        return -1;
    }
    mysql_set_character_set(mysql, "utf8");
    add(mysql);
    mysql_close(mysql);
    return 0;
}

编译并运行 +运行结果

4.3 修改数据(Update)

使用update语句更新表中的现有记录。

cpp 复制代码
void mod(MYSQL *mysql)
{
    char *sql = "update test_tb set age=34 where name='张三';";
    int ret = mysql_query(mysql, sql);
    if (ret != 0)
    {
        printf("mysql query error:%s\n", mysql_error(mysql));
        return;
    }
    return;
}

运行结果

4.4 删除数据(Delete)

使用delete语句从表中删除记录。

cpp 复制代码
void del(MYSQL *mysql)
{
    char *sql = "delete from test_tb where name='张三';";
    int ret = mysql_query(mysql, sql);
    if (ret != 0)
    {
        printf("mysql query error:%s\n", mysql_error(mysql));
        return;
    }
    return;
}

运行结果

4.5 查询数据(Retrieve)

使用select语句检索表中的数据。

cpp 复制代码
void get(MYSQL *mysql)
{
    char *sql = "select * from test_tb;";
    int ret = mysql_query(mysql, sql);
    if (ret != 0)
    {
        printf("mysql query error:%s\n", mysql_error(mysql));
        return;
    }
    MYSQL_RES *res = mysql_store_result(mysql);
    if (res == NULL)
    {
        printf("mysql store result error:%s\n", mysql_error(mysql));
        return;
    }
    int row = mysql_num_rows(res);
    int col = mysql_num_fields(res);
    printf("%10s%10s%10s%10s\n", "ID", "年龄", "姓名", "成绩");
    for (int i = 0; i < row; i++)
    {
        MYSQL_ROW row_data = mysql_fetch_row(res);
        for (int i = 0; i < col; i++)
        {
            printf("%10s", row_data[i]);
        }
        printf("\n");
    }
    mysql_free_result(res);
    return;
}

运行结果

结语

通过本文的介绍,你应该对MySQL的C语言API有了深入的了解。使用这些API,你可以在C语言项目中实现对MySQL数据库的高效操作。虽然现代开发中更倾向于使用高级语言和ORM框架,但直接使用MySQL C API为理解数据库操作的细节提供了宝贵的视角。

相关推荐
打鱼又晒网10 分钟前
【MySQL】数据库精细化讲解:内置函数知识穿透与深度学习解析
数据库·mysql
大白要努力!15 分钟前
android 使用SQLiteOpenHelper 如何优化数据库的性能
android·数据库·oracle
tatasix1 小时前
MySQL UPDATE语句执行链路解析
数据库·mysql
南城花随雪。1 小时前
硬盘(HDD)与固态硬盘(SSD)详细解读
数据库
儿时可乖了1 小时前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
懒是一种态度1 小时前
Golang 调用 mongodb 的函数
数据库·mongodb·golang
天海华兮1 小时前
mysql 去重 补全 取出重复 变量 函数 和存储过程
数据库·mysql
gma9992 小时前
Etcd 框架
数据库·etcd
爱吃青椒不爱吃西红柿‍️2 小时前
华为ASP与CSP是什么?
服务器·前端·数据库
Yz98763 小时前
hive的存储格式
大数据·数据库·数据仓库·hive·hadoop·数据库开发