【MySQL】使用C语言连接数据库

article/2025/6/21 18:23:31

目录

一、准备工作

二、数据表操作

(一)初始化数据库

(二)连接数据库

(三)设置字符集

(四)操作数据表

1、插入数据

2、删除数据

3、更新数据

4、查询数据


一、准备工作

        在之前的文章中都是使用 MySQL 客户端以命令行的形式进行数据库操作,但在实际开发中是以语言级别的形式对数据库进行操作。

        首先需要创建一个用户以供操作,用户管理详见:【MySQL】视图与用户管理-CSDN博客

        其次还需要准备一个测试表:

mysql> create table person(-> id int primary key auto_increment,-> name varchar(20) not null,-> age int not null,-> telephone varchar(20) unique);
Query OK, 0 rows affected (0.02 sec)mysql> insert into person values(1,'张三',18,'123456'), (2,'李四',20,'123789');
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0mysql> select * from person;
+----+--------+-----+-----------+
| id | name   | age | telephone |
+----+--------+-----+-----------+
|  1 | 张三   |  18 | 123456    |
|  2 | 李四   |  20 | 123789    |
+----+--------+-----+-----------+
2 rows in set (0.00 sec)

        接下来需要配置环境,只要正常下载了 MySQL,它会自动把相关的库也会给配置好,在使用时需要配置好项目的环境以及包含好相应的头文件即可。以下是用于验证代码环境是否配置成功:

# 下载并安装 MySQL 仓库配置
sudo dnf install https://dev.mysql.com/get/mysql80-community-release-el8-1.noarch.rpm# 更新仓库缓存
sudo dnf update# 安装 MySQL 开发包(包含头文件和链接库)
sudo dnf install mysql-devel
# 若GBK报错
sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
sudo dnf clean all
# 若无效
sudo dnf install mysql-community-devel --nogpgcheck# 查看头文件路径(关键用于 C 编译)
ls /usr/include/mysql    //若输出包含 mysql.h 等头文件,则安装成功

        当配置好坏境以后,我们就可以使用 MySQL 提供的 API 进行编程了。

#include <iostream>
#include <mysql.h>
using namespace std;
int main()
{printf("mysql client Version: %s\n", mysql_get_client_info());return 0;
}

        在编译连接时需要指明 MySQL 头文件以及库文件,以下是makefile文件:

mysql:mysql.cppg++ -o $@ $^ -std=c++11 -I/usr/include/mysql -L/usr/lib64/mysql -lmysqlclient
.PHONY:clean
clean:rm -rf mysql

二、数据表操作

(一)初始化数据库

//初始化数据库
MYSQL *mysql_init(MYSQL *mysql);

作用:初始化数据库,连接数据库前的必要条件;

参数:若传入NULL,则会新建并初始化一个MySQL对象;

           若传入已有的MySQL指针,则会重置该指向的对象;

返回值:成功返回初始化后的对象,失败返回NULL。

(二)连接数据库

        想对数据库进行操作,必须先进行初始化,之后再需要连接数据库。

//连接数据库
MYSQL *mysql_real_connect(MYSQL *mysql,           // 已初始化的 MYSQL 结构体指针const char *host,       // 服务器主机名或 IP 地址const char *user,       // 登录用户名const char *passwd,     // 登录密码const char *db,         // 默认数据库名unsigned int port,      // TCP/IP 端口号(0 表示默认 3306)const char *unix_socket,// Unix 套接字路径(NULL 表示不使用)unsigned long client_flag //客户端标志位(通常为 0)
);

作用:连接数据库;

参数:各个字段意义已在代码中注释;

返回值:成功返回传入的 MySQL 指针,失败返回NULL。

        案例:

#include <iostream>
#include <string>
#include <mysql.h>
using namespace std;
const string host = "127.0.0.1";
const string user = "X";
const string passwd = "Mht1412.";
const string db_name = "test";int main()
{MYSQL *mysql = mysql_init(nullptr);if (!mysql){cerr << "初始化失败" << endl;return 1;}if (!mysql_real_connect(mysql, host.c_str(), user.c_str(), passwd.c_str(), db_name.c_str(), 3306, nullptr, 0)){cerr << "数据库连接失败" << endl;return 2;}cout << "数据库连接成功" << endl;mysql_close(mysql); // 关闭MySQLreturn 0;
}

(三)设置字符集

        连接数据库成功后,已经可以正常对表进行操作,但是获取中文会是乱码。这是因为原始默认的字符集时 latin1, 需要设置为 utf8。

//设置字符集
mysql_set_character_set(myfd, "utf8");

(四)操作数据表

        对数据表进行操作使用的是同一个接口,只是传入不同的参数从而达到不同的效果:

int mysql_query(MYSQL *mysql, const char *q);

作用:操作数据表;

参数:指针mysql 为初始化生成的mysql指针,也就是数据库句柄;

            q 为传入的 MySQL 语句。

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

1、插入数据

#include <iostream>
#include <string>
#include <mysql.h>
using namespace std;
const string host = "127.0.0.1";
const string user = "X";
const string passwd = "Mht1412.";
const string db_name = "test";int main()
{MYSQL *mysql = mysql_init(nullptr);if (!mysql){cerr << "初始化失败" << endl;return 1;}if (!mysql_real_connect(mysql, host.c_str(), user.c_str(), passwd.c_str(), db_name.c_str(), 3306, nullptr, 0)){cerr << "数据库连接失败" << endl;return 2;}cout << "数据库连接成功" << endl;string sql = "insert into person values (3, '王五', 19, 456789)";if (mysql_query(mysql, sql.c_str())){cerr << "数据库操作失败" << endl;return 3;}cout << "数据库操作成功" << endl;mysql_close(mysql); // 关闭MySQLreturn 0;
}

         运行结果:

2、删除数据

#include <iostream>
#include <string>
#include <mysql.h>
using namespace std;
const string host = "127.0.0.1";
const string user = "X";
const string passwd = "Mht1412.";
const string db_name = "test";int main()
{MYSQL *mysql = mysql_init(nullptr);if (!mysql){cerr << "初始化失败" << endl;return 1;}if (!mysql_real_connect(mysql, host.c_str(), user.c_str(), passwd.c_str(), db_name.c_str(), 3306, nullptr, 0)){cerr << "数据库连接失败" << endl;return 2;}cout << "数据库连接成功" << endl;string sql = "delete from person where id = 3";if (mysql_query(mysql, sql.c_str())){cerr << "数据库操作失败" << endl;return 3;}cout << "数据库操作成功" << endl;mysql_close(mysql); // 关闭MySQLreturn 0;
}

        运行结果:

3、更新数据

#include <iostream>
#include <string>
#include <mysql.h>
using namespace std;
const string host = "127.0.0.1";
const string user = "X";
const string passwd = "Mht1412.";
const string db_name = "test";int main()
{MYSQL *mysql = mysql_init(nullptr);if (!mysql){cerr << "初始化失败" << endl;return 1;}if (!mysql_real_connect(mysql, host.c_str(), user.c_str(), passwd.c_str(), db_name.c_str(), 3306, nullptr, 0)){cerr << "数据库连接失败" << endl;return 2;}cout << "数据库连接成功" << endl;string sql = "update person set name='王五' where name='张三'";if (mysql_query(mysql, sql.c_str())){cerr << "数据库操作失败" << endl;return 3;}cout << "数据库操作成功" << endl;mysql_close(mysql); // 关闭MySQLreturn 0;
}

        运行结果:

4、查询数据

        不同于插入、删除与更新操作,查询数据执行成功后是需要显示数据的,因此需要获取查询结果。

//获取查询结果
MYSQL_RES *mysql_store_result(MYSQL *mysql);
//获取查询结果列名
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);、
//获取查询结果行数
unsigned int mysql_num_rows(MYSQL_RES *res);
//获取查询结果列数
unsigned int mysql_num_fields(MYSQL_RES *res);
//获取结果内容
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
//释放存储结果
void mysql_free_result((MYSQL_RES *result);

        其中 MYSQL_RES 结构体在使用层面上可以简单理解为二维数组, MYSQL_ROW 是记录数据表中一行的数据,可以简单理解为迭代器在整个返回的数据内容中进行遍历。

#include <iostream>
#include <string>
#include <mysql.h>
using namespace std;
const string host = "127.0.0.1";
const string user = "X";
const string passwd = "Mht1412.";
const string db_name = "test";int main()
{MYSQL *mysql = mysql_init(nullptr);if (!mysql){cerr << "初始化失败" << endl;return 1;}if (!mysql_real_connect(mysql, host.c_str(), user.c_str(), passwd.c_str(), db_name.c_str(), 3306, nullptr, 0)){cerr << "数据库连接失败" << endl;return 2;}cout << "数据库连接成功" << endl;string sql = "select * from person";if (mysql_query(mysql, sql.c_str())){cerr << "数据库操作失败" << endl;return 3;}cout << "数据库操作成功" << endl;// 获取查询结果MYSQL_RES *res = mysql_store_result(mysql);// 获取查询结果行列数unsigned int rows = mysql_num_rows(res);unsigned int fields = mysql_num_fields(res);// 获取查询结果列名MYSQL_FIELD *fifld = mysql_fetch_fields(res);for (int i = 0; i < fields; ++i){cout << fifld[i].name << "\t";}cout << endl;for (int i = 0; i < rows; ++i){// 依次获取查询结果中行信息MYSQL_ROW row = mysql_fetch_row(res);for (int j = 0; j < fields; ++j){cout << row[j] << "\t";}cout << endl;}// 释放查询结果mysql_free_result(res);mysql_close(mysql); // 关闭MySQLreturn 0;
}

        运行结果:


http://www.hkcw.cn/article/MFTVEYTTcp.shtml

相关文章

高效会议记录工具使用指南

软件介绍 本文介绍一款名为"吗喽会议"的安卓平台会议记录软件&#xff0c;经过测试体验非常出色&#xff0c;特向大家推荐。 软件定位与核心功能 这是一款专为职场人士设计的会议记录应用程序&#xff0c;其核心优势在于强大的语音识别能力&#xff0c;能够实时将…

基于vue3-elemenyui的页面加载及新建浏览页案例

1.参考链接&#xff1a; 基于创建vue3链接&#xff1a;Vue3前端项目创建_vscode创建vue3项目-CSDN博客 基于创建elementui链接&#xff1a;Vue3引入ElementPlus_vue引入element-plus-CSDN博客 2.案例内容 该案例实现了基本的app.vue的路由跳转、新建浏览页参数传入以及浏览…

详解|证券、基金、期货:银证转账系统

Hi,围炉喝茶聊产品的新老朋友好!在话题未开始之前,先看组见证历史数据:2024年国庆节前,沪深两市成交额连续多日突破万亿。今日开盘后仅20分钟,沪深两市成交额突破1万亿元,刷新此前9月30日创下的历史最快万亿纪录。大量资金需要从银行存管账户转入证券存管账户。银行端和…

香港警方回应恒生银行抢劫案 嫌疑人暂未落网

香港一家恒生银行日前发生持刀抢劫案,持续引发关注。6月2日17时许,一名男子独自进入香港恒生银行沙田第一城分行,坐下约15分钟后突然拿出一把刀,威胁一名女性银行职员,并劫走约30余万港元及少量外币后逃离现场。案件导致一名银行职员颈部受轻伤,送往医院治疗后已出院,其…

政策朝令夕改 美国正在失去方向 关税政策摇摆不定

5月30日,美国总统特朗普宣布将进口钢铝关税上调至50%。短短几天内,美国关税政策再度急转弯,三项法院裁决让白宫主导的关税博弈更加复杂。美国国际贸易法院叫停大多数关税措施后,联邦巡回上诉法院暂时搁置“叫停令”。随后,一家联邦法院裁定总统无权利用“紧急权力”加征关…

雷军发文疑似回应余承东 诋毁即仰望

雷军发文疑似回应余承东 诋毁即仰望。6月1日,小米集团董事长雷军在其社交账号上发文称,公司正全力准备小米yu7的大规模量产,预计7月份开始。他还引用了莫言的一句名言:“诋毁,本身就是一种仰望。”5月31日下午,华为常务董事、终端BG董事长余承东在未来汽车先行者大会上表…

【Linux系列】Gunicorn 进程架构解析:主进程与工作进程

博客目录 引言一、Gunicorn 的基本架构概述二、主进程&#xff08;Master Process&#xff09;的职责分析三、工作进程&#xff08;Worker Process&#xff09;的功能剖析四、主进程与工作进程的交互机制五、多进程架构的优势与挑战六、实际运维中的常见场景分析七、进阶主题&a…

全国范围入户调查已开始 国家统计局发布跟访计划

国家统计局日前发布《致人口固定样本跟访调查对象的一封信》,决定于2025年在全国范围内开展两次人口固定样本跟访调查。这两次调查的标准时点分别是6月1日零时和11月1日零时。调查员将在6月1日至6月25日以及11月16日至12月5日期间入户开展调查工作。责任编辑:zhangxiaohua

女子连吃四天粽子视力骤降 糖尿病患者需谨慎饮食

女子连吃四天粽子视力骤降 糖尿病患者需谨慎饮食!赵女士今年60岁,在端午节期间,她从常去的两家棋牌室和社区活动中领到了不少粽子、咸鸭蛋和绿豆糕。为了防止食物变质,她决定尽快吃完这些食品。然而,在连续吃了四天粽子后,赵女士突然发现自己的左眼变得模糊不清,这让她非…

一文读懂韩国总统选举 五人角逐花落谁家

韩国第21届总统选举于当地时间6月3日上午6时开始正式投票。此次选举在前总统尹锡悦被弹劾后举行,受到各界高度关注。最终有5名候选人参加角逐,分别是共同民主党候选人李在明、国民力量党候选人金文洙、改革新党候选人李俊锡、民主劳动党候选人权英国和无党派候选人宋镇镐。其…

【Hot 100】70. 爬楼梯

目录 引言爬楼梯我的解题代码优化 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;算法专栏&#x1f4a5; 标题&#xff1a;【Hot 100】70. 爬楼梯❣️ 寄语&#xff1a;书到用时方恨少&#xff0c;事非经过不知难&#xff01; 引言 爬楼梯 &…

金饰克价涨至1024元 金饰克价一夜涨20元

6月2日,国际金价大幅走高,现货黄金涨2.8%,报3380.81美元/盎司;COMEX黄金期货涨2.74%,报3406.40美元/盎司。6月3日,国内金饰价格跟涨。周生生足金饰品标价1024元/克,较前一日1004元/克的价格上涨20元/克,2天上涨26元。责任编辑:zx0002

“苏超”缘何盛产热梗 地域文化与经济活力碰撞

江苏省城市足球联赛首次举办,13个设区市各组一支队伍参与角逐。经过三轮比赛后,南通队暂列第一。比赛不仅展现了真实的竞技精神,还激发了大量网络段子和梗文化。无锡队在客场挑战泰州队失利,有人戏称是因为无锡人吃不惯不放糖的汤面导致低血糖。而泰州队的胜利则被归因于主…

一次炸毁俄41架军机?乌如何做到的 特别行动揭秘

乌克兰安全局内部人士透露,代号“蛛网”的特别行动历时18个月的策划和实施,成功摧毁了41架俄军战略轰炸机。此次行动由泽连斯基亲自协调,安全局局长马柳克率队直接实施。知情人士表示,该行动在后勤保障方面极具挑战性。首先通过秘密渠道向俄境内输送FPV无人机,然后转运移动…

2025年人口固定样本跟访调查启动 数据支持人口高质量发展

2025年人口固定样本跟访调查于6月1日正式启动,旨在为加强人口统计和动态监测预警、更好地服务人口高质量发展提供数据支持。今年的调查将在6月1日与11月1日各进行一次,基于第七次全国人口普查结果,共抽取了30万人作为样本,其中6月份调查20万人,11月份调查剩余10万人。调查…

国内油价五连降或迎破灭!车主期待落空

国内油价五连降或迎破灭!车主期待落空。在生活的舞台上,油价的每一次波动都吸引着无数人的目光,尤其是广大车主。过去一段时间里,国内油价经历了连续四个月的下调,92号汽油价格重回“6元时代”,降至近三年以来的新低。按照国六阶段成品油标准品89号汽油价格计算,自2月以…

男子无意发现媳妇袜子收藏柜:她带娃顾家很辛苦

5月31日,辽宁。男子无意发现媳妇的袜子收藏柜,看到满柜的袜子无语笑了,平时别碰驱虫药啥的了,你媳妇可能是蜈蚣允悲。网友:知足吧,你媳妇屯袜子,我媳妇屯鞋子。责任编辑:zx0002

18岁女孩打美容针后全身过敏出红斑住进ICU

6月2日河南新乡,18岁花季少女打水光针,全身过敏出红斑,女儿在医院ICU抢救,妈妈无奈求助,“老板联系不上,想知道打的是什么药!”小莉跟着杨女士前往女儿当时打针的店面,发现门头已经被拆,处于一个未营业的状态。通过民警的帮助,美容店老板出面解释。责任编辑:zx0002

男子开收割机冲进起火麦田抢收 00后勇担责任

男子开收割机冲进起火麦田抢收 00后勇担责任!当20多亩麦田被大火包围时,湖北天门一位00后收割机司机小王毫不犹豫地驾驶收割机冲进火海,在浓烟滚滚中抢收小麦。这一幕比任何超级英雄电影都要震撼人心,展现了新时代年轻人的责任担当。那天下午,湖北天门某村庄里发生了一件让…

Golang——4、数组、切片和map

数组、切片和map 1、数组1.1、数组定义1.2、数组的初始化1.3、数组的遍历1.4、数组是值类型1.5、多维数组 2、切片2.1、切片的定义2.2、关于nil2.3、切片的遍历2.4、基于数组定义切片2.5、基于切片定义切片2.6、关于切片的长度和容量2.7、切片的本质2.8、使用make函数构造切片2…