展开菜单
首页 精品内容 本月促销 装机必备 Windows PDF教程 macOS软件 IOS软件 Android AI 专题
全部分类

当前位置:

首页 > 编程开发 > MYSQL访问之如何使用C/C++连接数据库

MYSQL访问之如何使用C/C++连接数据库

在C/C++后端开发中,利用MySQL官方CAPI库,程序可建立数据库连接、执行SQL语句并获取结果集,从而替代手动敲写SQL,提升自动化与效率。

本文目录
    好的,作为一位在数据库和后台开发领域深耕多年的老手,我来帮你把这篇文章“盘活”一下,去掉那股“AI味”,换上咱们工程师自己说话的语气。

    1. 前言

    直接在MySQL客户端里敲SQL,是学习阶段的事。真正做应用开发时,你得在代码里跟数据库打交道。比如你用C/C++写后端服务,怎么在程序里连接MySQL、执行SQL、拿结果?这就需要用到MySQL官方提供的C API库了。

    开工之前,先做几件事:

    创建一个专用的 MySQL 用户账号。为什么?安全第一,别在代码里直接写 root 密码。

    • 创建一个测试库 conn。
    • 创建一个账号 xay,并只给它操作 conn 库的权限,且限制它只能本地登录。命令是这样的:`grant all on conn.* to 'xay'@'localhost';`

    然后,安装 C/C++ 访问 MySQL 所需的开发库。在 CentOS 上,一条命令搞定:`yum install mysql-devel`。它会装好头文件和动态链接库。头文件一般在 `/usr/include/mysql`,库文件则在 `/usr/lib64/mysql`。

    2. 核心API接口与应用

    MySQL的C API设计得很直观,整个流程和操作文件很像:打开 -> 操作 -> 关闭。这里的“文件”就是数据库连接,对应的“句柄”类型叫 MYSQL。

    2.1 初始化和连接

    mysql_init()

    函数原型:MYSQL *mysql_init(MYSQL *mysql)

    功能:初始化一个MYSQL句柄。记住,在使用任何其他MySQL API之前,必须先调用它来创建和初始化一个连接句柄。

    用起来很简单:`MYSQL *my = mysql_init(nullptr);`。传个nullptr进去,它会自动分配并返回一个新的MYSQL对象给你。

    mysql_real_connect()

    初始化完毕,得用这个函数建立真正的连接,才算真正连上数据库。

    函数原型: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:`mysql_init` 的返回值
    • host:要连接的主机IP或域名
    • user:登录用户名
    • password:登录密码
    • db:要连接的数据库名
    • port:MySQL服务端口,默认是3306
    • unix_socket:域间套接字。本地连接时,可以指定socket文件路径,否则传nullptr
    • client_flag:一般设置成0

    连接建立后,如果库里有中文,查出来很可能是乱码。别慌,这是因为连接的默认字符集是 latin1。只要在连接成功后,立刻把字符集设置成 utf8mb4 就行了。很多新手会栽在这个坑里,提前注意一下。

    2.2 执行SQL和获取结果

    mysql_query()

    函数原型:int mysql_query(MYSQL *mysql, const char *q);

    功能:下发并执行一条MySQL命令。

    参数:

    • mysql:`mysql_init` 的返回值
    • q:要执行的SQL语句,比如 `"select * from table"`

    返回值:成功返回0,失败返回非0。

    获取结果集:看场景来

    SQL执行完,要区分两种情况。如果是增、删、改语句,主要关心操作成不成功,看 `mysql_query` 的返回值和受影响的行数就行。但如果是查询语句,得把返回的数据表读出来,这就得用到结果集相关的函数了。

    怎么拿查询结果?如果 `mysql_query` 执行 `select` 成功,就可以通过 mysql_store_result 把结果集从服务器拉到客户端内存里。

    函数原型:MYSQL_RES *mysql_store_result(MYSQL *mysql);

    功能:把服务器返回的整个查询结果集存到本地。返回一个 `MYSQL_RES` 类型的指针,通过它来解析表格数据。

    注意,这个函数内部会 malloc 一片内存来存结果,用完结果集后,必须调用 `mysql_free_result(result)` 来释放,否则会内存泄漏。

    解析结果集

    拿到 `MYSQL_RES *` 后,就可以像操作二维表一样来读数据了。

    获取行数:mysql_num_rows

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

    功能:返回结果集的总行数。

    获取列数:mysql_num_fields

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

    功能:返回结果集的总列数。

    获取列名(字段头):mysql_fetch_fields

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

    功能:返回一个包含所有字段信息的数组,数组长度就是列数。通过 `MYSQL_FIELD` 结构体中的 `name` 成员,就能拿到每一列的列名。

    MYSQL_FIELD 常用成员属性:

    成员名类型说明
    namechar *列名,如 `"id"`、`"username"`,最常用
    tablechar *该列所属的表名(多表查询时很有用)
    dbchar *该列所属的数据库名
    catalogchar *目录名,通常全是 `"def"`
    defchar *该列的默认值(没有则为NULL)
    lengthunsigned long该列定义的最大长度,如 `varchar(100)` 就是 `100`
    typeenum enum_field_types该列的MySQL数据类型,如 `MYSQL_TYPE_LONG`(整数)、`MYSQL_TYPE_VAR_STRING`(变长字符串),用来判断某列是数字还是字符串
    flagsunsigned int列的标志位,一个位掩码,常见的有:

    • `NOT_NULL_FLAG` - 字段不能为空

    • `PRI_KEY_FLAG` - 是主键的一部分

    • `UNIQUE_KEY_FLAG` - 是唯一键的一部分

    • `AUTO_INCREMENT_FLAG` - 自增字段

    • `NUM_FLAG` - 数字类型

    等等

    charsetnrunsigned int该列的字符集编号

    获取每一行数据:mysql_fetch_row

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

    功能:逐行读结果集。每次调用,返回一个指向当前行数据的 `MYSQL_ROW`,并把内部指针移到下一行。没有更多行时,返回NULL。

    `MYSQL_ROW` 本质上是 `char **`,可以当成字符串数组,通过下标 `row[0]`、`row[1]`... 来访问该行每一列的值。

    2.3 接口的使用

    上面讲的接口,实际用起来是这样:

    ``` // 打印表的字段 MYSQL_FIELD *fields_array = mysql_fetch_fields(res); for(my_ulonglong i = 0; i < fields; i++) std::cout << fields_array[i].name << 't'; std::cout << std::endl; my_ulonglong rows = mysql_num_rows(res); my_ulonglong fields = mysql_num_fields(res); std::cout << "行: " << rows << std::endl; std::cout << "列: " << fields << std::endl; for(my_ulonglong i = 0; i < rows; i++) { MYSQL_ROW data = mysql_fetch_row(res); for(my_ulonglong j = 0; j < fields; j++) { std::cout << data[j] << "t"; } std::cout << std::endl; } ```

    跑一下上面的代码,结果大概是这样:

    `mysql_real_connect() success`
    `mysql_query success`
    `行: 5`
    `列: 3`
    `id name blance`
    `1 张三 100.00`
    `2 李四 200.00`
    `3 王五 300.00`
    `4 赵六 400.00`
    `6 南宫 600.00`

    上面的例子是单个连接的简单用法。但在真实的Web服务器里,每个用户请求都新建和销毁连接,开销太大,并发连接数也控制不住。所以,实际项目里都用连接池。

    连接池本质上就是个管理数据库连接的容器,里面有个线程池和一组预先建好的MySQL连接对象。业务线程要用数据库时,从池里“借”个空闲连接,用完了再“还”回去,而不是直接关掉。这样性能好得多,资源利用率也高。

    3. 结尾

    一个用户逻辑是如何执行的?(以注册和登录为例)

    结合上面讲到的C/C++访问数据库技术,咱们来梳理一下用户注册和登录的后台流程。需要注意,网站服务器不会直接跟数据库交互,它们之间通常有一层用编程语言实现的“中间件”或后端服务。

    注册流程:

    1. 用户向网站A发起注册请求。
    2. 网站A的Web服务器收到请求,返回注册页面。
    3. 用户填好用户名、密码等信息,点提交。
    4. 网站A的后端服务(可能是C/C++/Ja va/Go写的)拿到用户提交的数据,提取出账号、密码等参数。
    5. 后端服务先把密码加密(为了安全,绝不可能明文存)。
    6. 后端服务把注册逻辑拼成一条SQL,比如 `insert into user ...`。
    7. 这条SQL被下发给“中间件”(负责负载均衡、分库分表等)。中间件决定数据该写到哪个数据库实例。
    8. 到这一步,中间件或最终执行SQL的后台线程,就会用前面讲的 `mysql_init`、`mysql_real_connect` 这些API,从连接池里拿连接,执行insert。
    9. 数据库操作成功,结果一层层返回,最后网站A告诉用户“注册成功”。同时,多个数据库节点间会做数据同步,保证数据一致。

    登录流程:

    1. 用户向网站A发起登录请求,拿到登录页面。
    2. 用户输入账号、密码并提交。
    3. 网站A后端服务收到请求,提取参数。
    4. 后端服务拼一条查询SQL,比如 `select user_id, password from user where username='...'`。
    5. 通过中间件路由,SQL最终到达具体数据库。
    6. 到这一步,后台程序再次通过C API,从连接池拿连接,执行select,并用 `mysql_store_result` 和 `mysql_fetch_row` 拿到查询结果。
    7. 后台程序把查到的加密密码,和用户输入的密码的加密结果做比较。
    8. 匹配就生成会话凭证(Session),返回登录成功;不匹配,就返回账号或密码错误。

    通过C/C++的API,应用和数据存储之间的桥梁就打通了。数据不再是死的,能被灵活地用在各种活的应用逻辑里。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发
    相关文章 更多
    精品专题 更多
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    IOS软件

    正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

    AI

    正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw macOS版
    AionClaw macOS版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy macOS版
    Loomy macOS版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。

    AirBuddy 3 macOS版
    AirBuddy 3 macOS版

    AirBuddy 3 是面向 macOS 的蓝牙外设增强工具,可集中查看 AirPods、Beats 与苹果设备电量,提供快速连接、播放控制、电量提醒、桌面小组件和多台 Mac 外设接力等功能。

    AirServer macOS版
    AirServer macOS版

    AirServer macOS版可把 Mac 转换为无线投屏接收端,通过 AirPlay 或 Google Cast 接收手机、平板和电脑画面,并支持多设备同时连接、高清镜像及会话录制,适合家庭娱乐、课堂教学、会议演示和应用展示。

    AnyDesk macOS版
    AnyDesk macOS版

    AnyDesk macOS版是一款适用于远程办公、设备维护和客户支持的远程桌面工具,可连接并操作异地计算机,支持文件传输、无人值守访问、会话权限控制及跨平台协作。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。

    讯飞绘文 网页版
    讯飞绘文 网页版

    讯飞绘文网页版是科大讯飞推出的AI图文创作与内容运营工具,覆盖热点选题、文章生成、稿件校对、智能配图、排版发布和数据复盘等环节,适合自媒体创作者及内容团队在线使用。

    Maya(Autodesk Maya) Windows版
    Maya(Autodesk Maya) Windows版

    Autodesk Maya 是面向影视、电视、动画和游戏行业的专业三维制作软件,集多边形与 NURBS 建模、角色绑定、关键帧和动作捕捉动画、Bifrost 特效模拟、材质开发及 Arnold 渲染于一体,

    Aperty Windows版
    Aperty Windows版

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    立刻MV 网页版
    立刻MV 网页版

    立刻MV 面向音乐人、内容创作者和品牌团队,帮助用户低成本完成歌曲 MV、歌词视频、AI 分镜、图生视频与最终合成。

    蛙蛙写作 网页版
    蛙蛙写作 网页版

    蛙蛙写作 AI 创作工具,覆盖小说、剧本、文案,一键生成文稿,打通文字转视频全流程,高效解决创作难题。

    超级简历WonderCV 网页版
    超级简历WonderCV 网页版

    超级简历WonderCV是面向应届生和AI小白的智能求职平台,覆盖简历、面试与职业规划。

    音述AI 网页版
    音述AI 网页版

    音述AI,是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区。

    AionClaw Windows版
    AionClaw Windows版

    AionClaw 是可在桌面端运行的任务型 AI 助手,通过数字专家与技能市场组合办公、创作、数据和开发能力。

    Loomy Windows版
    Loomy Windows版

    Loomy 是科大讯飞推出的桌面 AI 助手,可通过对话、任务与工作目录协助处理办公、内容创作和资料整理。