当前位置: 首页 > news >正文

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

目录

引言

一. MySQL C API简介

二. MySQL C API核心函数

2.1 初始化和连接

2.2 配置和执行

2.3 处理结果

2.4 清理和关闭

2.5 错误处理

三. MySQL使用过程

四. 实现CRUD操作

4.1 创建数据库并建立表

​编辑

4.2 添加数据(Create)

​编辑

​编辑

​编辑4.3 修改数据(Update)

​编辑

4.4 删除数据(Delete)

4.5 查询数据(Retrieve)

结语


引言

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

一. MySQL C API简介

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

二. MySQL C API核心函数

// 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 创建数据库并建立表

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语句向数据库表中添加新记录。

#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语句更新表中的现有记录。

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语句从表中删除记录。

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语句检索表中的数据。

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为理解数据库操作的细节提供了宝贵的视角。

相关文章:

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

目录 引言 一. MySQL C API简介 二. MySQL C API核心函数 2.1 初始化和连接 2.2 配置和执行 2.3 处理结果 2.4 清理和关闭 2.5 错误处理 三. MySQL使用过程 四. 实现CRUD操作 4.1 创建数据库并建立表 ​编辑 4.2 添加数据&#xff08;Create&#xff09; ​编辑 …...

武汉流星汇聚:亚马逊助力跨境电商扬帆起航,海外影响力显著提升

在全球化浪潮的推动下&#xff0c;跨境电商已成为连接世界市场的重要桥梁。而在这场跨越国界的商业盛宴中&#xff0c;亚马逊作为全球电商的领军者&#xff0c;以其独特的商业模式、庞大的用户基础&#xff0c;为无数企业提供了前所未有的发展机遇。武汉流星汇聚电子商务有限公…...

C语言:设计模式

C语言和设计模式&#xff08;总结篇&#xff09; 书籍&#xff1a;《大话设计模式》 2、C语言和设计模式&#xff1a;原型模式&#xff08;复制自己&#xff0c;生成另外一个实例对象&#xff09; 17、C语言实现面向对象编程 : 封装、继承、多态 ---- C语言可&#xff1a;封…...

Pandas数据选择的艺术:深入理解loc和iloc

在数据科学领域&#xff0c;Pandas是处理和分析数据的瑞士军刀。掌握Pandas中的数据选择技巧&#xff0c;尤其是loc和iloc的使用&#xff0c;对于提高数据处理效率至关重要。本文将深入探讨loc和iloc的用法&#xff0c;通过丰富的示例&#xff0c;帮助你精确地选取所需的数据&a…...

<数据集>固定视角监控牧场绵羊识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;3615张 标注数量(xml文件个数)&#xff1a;3615 标注数量(txt文件个数)&#xff1a;3615 标注类别数&#xff1a;1 标注类别名称&#xff1a;[Sheep] 序号类别名称图片数框数1Sheep361529632 使用标注工具&#…...

浙大数据结构慕课课后题(06-图2 Saving James Bond - Easy Version)(拯救007)

题目要求&#xff1a; This time let us consider the situation in the movie "Live and Let Die" in which James Bond, the worlds most famous spy, was captured by a group of drug dealers. He was sent to a small piece of land at the center of a lake fi…...

前置(1):npn 和yarn ,pnpm安装依赖都是从那个源安装的啊,有啥优缺点呢

在使用 npm、yarn 或 pnpm 进行依赖管理和安装时&#xff0c;它们通常默认从 npm 的公共仓库&#xff08;https://registry.npmjs.org/&#xff09;获取包。不过&#xff0c;用户可以配置它们以从其他源获取&#xff0c;例如企业内部的私有仓库或镜像站点&#xff08;如淘宝的 …...

视频融合项目中的平台抉择:6大关键要素助力精准选型

随着安防监控系统行业的快速发展&#xff0c;视频融合项目逐渐成为城市治理、企业管理及智能建筑等领域的重要组成部分。视频融合平台作为视频数据整合、管理和分析的核心&#xff0c;其选择直接影响到项目的成功与否。 在当前智慧业务类项目的集成过程中&#xff0c;我们不仅…...

微信小程序项目结构

微信小程序的项目结构相对清晰&#xff0c;主要包括以下几个部分&#xff1a; 一、项目根目录文件 app.js&#xff1a;小程序项目的入口文件&#xff0c;通过调用App()函数来启动整个小程序的生命周期。这个文件包含了小程序的全局数据、生命周期函数等。 app.json&#xff1a;…...

C++unordered_map的用法

unordered_map的简介 unordered_map是一种容器&#xff0c;可以把字符串当做数字&#xff0c;可以使用[]操作符来访问key值对应的值。 格式&#xff1a; unordered_map<要被转换的类型&#xff0c;转换的类型> 变量名{{要被转换的数或字符&#xff0c;转换的数或字符}}/…...

代码随想录算法训练营第三十六天| 188.买卖股票的最佳时机IV、309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费

写代码的第三十六天 买股票&#xff0c;卡卡买股票&#xff0c;就爱买股票。。。 188.买卖股票的最佳时机IV 思路 本题是多次进行买卖&#xff0c;所以根据上题进行修改。 解决问题1&#xff1a;dp数组的含义以及定义&#xff1f;上题定义的事dp[i][0]初始状态,dp[i][1]第一…...

Golang | Leetcode Golang题解之第332题重新安排行程

题目&#xff1a; 题解&#xff1a; func findItinerary(tickets [][]string) []string {var (m map[string][]string{}res []string)for _, ticket : range tickets {src, dst : ticket[0], ticket[1]m[src] append(m[src], dst)}for key : range m {sort.Strings(m[key])…...

Spring Boot - 通过ServletRequestHandledEvent事件实现接口请求的性能监控

文章目录 概述1. ServletRequestHandledEvent事件2. 实现步骤3. 优缺点分析4. 测试与验证小结其他方案1. 自定义拦截器2. 性能监控平台3. 使用Spring Boot Actuator4. APM工具 概述 在Spring框架中&#xff0c;监控接口请求的性能可以通过ServletRequestHandledEvent事件实现。…...

Docker相关配置记录

Docker相关配置记录 换源 {"registry-mirrors": ["https://dockerhub.icu","https://docker.chenby.cn","https://docker.1panel.live","https://docker.awsl9527.cn","https://docker.anyhub.us.kg","htt…...

MySQL中INT(3)与INT(11)

本文由 ChatMoney团队出品 开篇 在MySQL数据库设计的世界里&#xff0c;数据类型的选择是一项基础而又至关重要的任务。其中&#xff0c;INT数据类型因其广泛的应用和灵活性备受青睐。然而&#xff0c;围绕着INT(3)与INT(11)的具体差异&#xff0c;常常存在一些误解。本文旨在…...

Qt 窗口:菜单、工具与状态栏的应用

目录 引言&#xff1a; 1. 菜单栏 1.1 创建菜单栏 1.2 在菜单栏中添加菜单 1.3 创建菜单项 1.4 在菜单项之间添加分割线 1.5 综合示例 2.工具栏 2.1 创建工具栏 2.2 设置停靠位置 2.3 设置浮动属性 2.4 设置移动属性 3. 状态栏 3.1 状态栏的创建 3.2 在状态栏中显…...

学习必备好物有哪些?高三开学季好物推荐合集

新学期即将开启&#xff0c;学习必备好物有哪些&#xff1f;以下是特别为高三学生朋友们精心挑选的一系列好物推荐&#xff0c;旨在帮助大家在更快更好的选择&#xff0c;快来看看都有哪些吧&#xff01; 1、书客护眼大路灯Sun 书客是海内外知名的生物光学技术方案商&#xf…...

java的分类

目录 Java SE Java EE Java ME java主要分为三类&#xff0c;分别是Java SE&#xff0c;Java EE&#xff0c;Java ME。其中SE是EE和ME的基础。 Java SE 全名为Java Standard Edition&#xff0c;是 Java 平台的基础版本&#xff0c;为开发人员提供了构建和运行桌面应用程…...

基于火山引擎云搜索服务和豆包模型搭建 RAG 推理任务

大语言模型&#xff08;LLM&#xff0c;Large language model&#xff09;作为新一轮科技产业革命的战略性技术&#xff0c;其核心能力在于深层语境解析与知识融合。在生成式人工智能方向主要用于图像生成&#xff0c;书写文稿&#xff0c;信息搜索等。当下的 LLM 模型是基于大…...

Python 实现 Excel 文件操作的技术性详解

目录 一、引言 二、Excel 文件格式及库的选择 2.1 Excel 文件格式 2.2 库的选择 三、安装必要的库 四、使用 openpyxl 读取 Excel 文件 4.1 基本步骤 4.2 实战案例 五、使用 pandas 读取 Excel 文件 5.1 基本步骤 5.2 实战案例 六、写入 Excel 文件 6.1 使用 …...

Phi-3-mini-128k-instruct企业级应用:基于Dify构建智能客服知识库

Phi-3-mini-128k-instruct企业级应用&#xff1a;基于Dify构建智能客服知识库 最近和几个做企业服务的朋友聊天&#xff0c;大家普遍有个头疼的问题&#xff1a;客服团队每天要处理大量重复的产品咨询和技术问题&#xff0c;人力成本高不说&#xff0c;新员工培训周期还特别长…...

SEO 搜索引擎营销工具如何帮助网站进行社交媒体营销_SEO 搜索引擎营销工具如何分析网站用户行为

SEO 搜索引擎营销工具如何帮助网站进行社交媒体营销 在当前数字化营销的浪潮中&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;搜索引擎营销工具已经成为了许多企业和网站必不可少的工具。SEO工具不仅能够帮助网站提高在搜索引擎中的排名&#xff0c;还在社交媒体营销方…...

像素史诗·智识终端前端设计(Frontend-Design)实战:UI组件智能生成

像素史诗智识终端前端设计实战&#xff1a;UI组件智能生成 1. 前端设计的效率革命 想象一下这样的场景&#xff1a;产品经理刚描述完需求&#xff0c;设计稿和前端代码就已经自动生成。这听起来像是科幻情节&#xff0c;但借助像素史诗智识终端的前端设计能力&#xff0c;这种…...

从零到一:在阿里云上快速搭建高性能我的世界服务器

1. 阿里云服务器选购与配置 第一次在云服务上搭建游戏服务器可能会觉得复杂&#xff0c;但其实只要跟着步骤走&#xff0c;30分钟就能搞定。我去年帮朋友的游戏社群搭建过5个不同版本的MC服务器&#xff0c;踩过不少坑&#xff0c;也总结出一套最高效的方案。阿里云对新用户特别…...

腾讯优图Youtu-VL-4B-Instruct应用案例:电商商品自动描述、教育图表解析实战

腾讯优图Youtu-VL-4B-Instruct应用案例&#xff1a;电商商品自动描述、教育图表解析实战 1. 引言&#xff1a;当AI学会"看图说话" 想象一下这样的场景&#xff1a;电商平台每天需要处理数百万张商品图片&#xff0c;运营团队不得不加班加点编写商品描述&#xff1b…...

飞书集成全攻略:OpenClaw+Qwen3-4B-Thinking打造智能工作台

飞书集成全攻略&#xff1a;OpenClawQwen3-4B-Thinking打造智能工作台 1. 为什么选择OpenClawQwen3-4B-Thinking组合&#xff1f; 去年夏天&#xff0c;当我第一次尝试用AI自动化处理会议纪要时&#xff0c;经历了从兴奋到沮丧的全过程。当时使用的是某商业SaaS方案&#xff…...

OpenClaw安全配置指南:Qwen3-4B模型权限与操作边界管理

OpenClaw安全配置指南&#xff1a;Qwen3-4B模型权限与操作边界管理 1. 为什么需要特别关注OpenClaw的安全配置 上周我在调试一个自动整理文档的OpenClaw任务时&#xff0c;差点酿成大祸。当时我让AI助手帮我整理桌面上的项目资料&#xff0c;结果它"聪明"地把所有文…...

2026年服装收银软件选型指南:五大功能决定门店提效与增长

很多服装门店都遇到过这样的困境&#xff1a;网络波动导致无法收款&#xff0c;眼睁睁看着顾客放下衣服离开&#xff1b;促销规则设置不到位&#xff0c;收银时算错优惠引发客诉&#xff1b;活动结束了&#xff0c;线上线下数据对不上&#xff0c;投入的钱看不到效果。这些问题…...

IMU与GPS融合定位:从Matlab到C++代码实现的EKF融合算法与组合导航松耦合融合详解...

IMU和GPS融合 ekf融合定位 从matlab到c代码实现 组合导航松耦合融合 34页超级详细的文档&#xff0c;对每个函数都进行了非常详细的讲解分析 玩过无人机或者自动驾驶的朋友肯定听过组合导航&#xff0c;这玩意儿说白了就是IMU和GPS的二人转。一个像躁动的少年&#xff08;IMU高…...

解决Xcode真机调试常见问题:App ID限制与证书信任错误处理

Xcode真机调试全攻略&#xff1a;突破App ID限制与证书信任难题 1. 引言&#xff1a;为什么开发者需要掌握无证书调试&#xff1f; 在iOS开发过程中&#xff0c;真机调试是不可或缺的环节。然而&#xff0c;传统的证书配置流程繁琐复杂&#xff0c;尤其是对于独立开发者或小型…...