MySQL使用C语言连接

文章目录

    • 版本查看以及编译
    • mysql接口介绍
    • 初始化
    • 链接数据库
    • 下发mysql命令mysql_query
    • 获取执行结果mysql_store_result
    • 获取结果行数mysql_num_rows
    • 获取结果列数mysql_num_fields
    • 获取列名mysql_fetch_fields
    • 获取结果内容mysql_fetch_row
    • 关闭mysql链接mysql_close
    • C语言操作mysql
      • 查看连接数
    • 代码样例

官网下载 mysql库: https://dev.mysql.com/downloads/

版本查看以及编译

通过mysql_get_client_info()函数,来验证我们的引入是否成功

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

使用mysql8.0编译

g++ testmysql.cc $(mysql_config --cflags --libs)

输出:

lin@shilin:~/code-exercise/mysql$ ./a.out 
mysql client version: 8.0.42

使用mysql5.7编译

g++ -o testmysql testmysql.c -L/lib64/mysql -lmysqlclient

mysql接口介绍

初始化

MYSQL *mysql_init(MYSQL *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)

建立好链接之后,获取英文没有问题,如果获取中文是乱码:

设置链接的默认字符集是utf8,原始默认是latin1

mysql_set_character_set(myfd, "utf8");

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

下发mysql命令mysql_query

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

第一个参数上面已经介绍过,第二个参数为要执行的sql语句,如select * from table

获取执行结果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中的数据。

获取结果行数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_fetch_row

MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);

它会返回一个MYSQL_ROW变量,MYSQL_ROW其实就是char **

关闭mysql链接mysql_close

void mysql_close(MYSQL *sock);

mysql C api还支持事务等常用操作

my_bool STDCALL mysql_autocommit(MYSQL * mysql, my_bool auto_mode);
my_bool STDCALL mysql_commit(MYSQL * mysql);
my_bool STDCALL mysql_rollback(MYSQL * mysql);

其他接口可以查看官方文档

C语言操作mysql

  • 使用root用户创建数据库
mysql> create database conn;
  • 创建表
create table user( id bigint primary key auto_increment, name varchar(32) not null, age int not nulll, tel varchar(32) unique );
mysql> desc user;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | bigint      | NO   | PRI | NULL    | auto_increment |
| name  | varchar(32) | NO   |     | NULL    |                |
| age   | int         | NO   |     | NULL    |                |
| tel   | varchar(32) | YES  | UNI | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
  • 创建用户
create user '用户名'@'登陆主机/ip' identified by '密码';
  • 给予lsl用户权限
mysql> grant all on conn.* to 'lsl'@'%';
  • 刷新一下
flush privileges;

查看连接数

int main()
{// 初始化数据库MYSQL *my = mysql_init(nullptr);if(!my){std::cerr << "init mysql error" << std::endl;return 1;}// 连接数据库if(!mysql_real_connect(my, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0)){std::cerr << "connect MySQL error" << std::endl;}std::cout << "mysql success" << std::endl;sleep(100);mysql_close(my);return 0;
}
  • 在没有使用C语言连接的时候查看链接数
mysql> show processlist;
+-----+------+-----------+------+---------+------+-------+------------------+
| Id  | User | Host      | db   | Command | Time | State | Info             |
+-----+------+-----------+------+---------+------+-------+------------------+
| 200 | lsl  | localhost | conn | Query   |    0 | init  | show processlist |
+-----+------+-----------+------+---------+------+-------+------------------+
  • 使用C语言连接后查看
mysql> show processlist;
+-----+------+-----------------+------+---------+------+-------+------------------+
| Id  | User | Host            | db   | Command | Time | State | Info             |
+-----+------+-----------------+------+---------+------+-------+------------------+
| 200 | lsl  | localhost       | conn | Query   |    0 | init  | show processlist |
| 201 | lsl  | localhost:50824 | conn | Sleep   |    4 |       | NULL             |
+-----+------+-----------------+------+---------+------+-------+------------------+

代码样例

#include <iostream>
#include <unistd.h>
#include <mysql/mysql.h>using namespace std;// const std::string host = "127.0.0.0"; // 默认
const std::string host = "0.0.0.0"; // 这里是我自己修改的
const std::string user = "lsl";
const std::string passwd = "123456";
const std::string db = "conn";
const unsigned int port = 3306;int main()
{// 初始化数据库MYSQL *my = mysql_init(nullptr);if (!my){std::cerr << "init mysql error" << std::endl;return 1;}// 连接数据库if (!mysql_real_connect(my, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0)){std::cerr << "connect MySQL error" << std::endl;return 2;}std::cout << "mysql success" << std::endl;// 设置字符集mysql_set_character_set(my, "utf8");// 插入数据std::string sql_insert = "insert into user (name, age, tel) values ('王五', 22, '222222');";int n = mysql_query(my, sql_insert.c_str());if (!n)std::cout << sql_insert << " success!" << std::endl;else{std::cerr << sql_insert << " failed: " << n << std::endl;return 3;}// 修改数据std::string sql_update = "update user set name='李四' where id=1;";int n = mysql_query(my, sql_update.c_str());if (!n)std::cout << sql_update << " success!" << std::endl;else{std::cerr << sql_update << " failed: " << n << std::endl;return 4;}// 查询数据std::string sql_select = "select * from user;";int n = mysql_query(my, sql_select.c_str());if (n != 0){std::cerr << "mysql_query error: " << mysql_error(my) << std::endl;return 5;}MYSQL_RES *res = mysql_store_result(my);if (!res){std::cerr << "mysql_store_result error: " << mysql_error(my) << std::endl;return 6;}// 获取行列int rows = mysql_num_rows(res);int fields = mysql_num_fields(res);std::cout << "行:" << rows << std::endl;std::cout << "列:" << fields << std::endl;// 获取属性MYSQL_FIELD *fields_array = mysql_fetch_field(res);for (int i = 0; i < fields; i++){std::cout << fields_array[i].name << "\t";}std::cout << "\n";// 获取具体元素for (int i = 0; i < rows; i++){MYSQL_ROW row = mysql_fetch_row(res);for (int j = 0; j < fields; j++){std::cout << row[j] << "\t";}std::cout << "\n";}/* 手动插入数据std::string sql;while(true){std::cout << "MySQL>>> ";if(!std::getline(std::cin, sql) || sql == "quit" || sql == "exit"){std::cout << "Bye Bye~" << std::endl;break;}// 插入数据int n = mysql_query(my, sql.c_str());if(!n)std::cout << sql << "success!" << std::endl;elsestd::cerr << sql << "failed: " << n << std::endl;}*/mysql_free_result(res); // 不要忘记freemysql_close(my);return 0;
}// 版本测试
// int main()
// {
//     printf("mysql client version: %s\n", mysql_get_client_info());
//     return 0;
// }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/87351.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/87351.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

坚持每日Codeforces三题挑战:Day 7 - 题目详解(2025-06-11,难度:1200,1300,1500)

每天坚持写三道题第七天&#xff1a; Problem - A - Codeforces 1200 Problem - B - Codeforces 1300 Problem - A - Codeforces 1500 目录 题目一: 题目大意: 解题思路: 代码(C): 题目二: 题目大意: 解题思路: 代码(C): 题目三: 题目大意: 解题思路: 代码(C): …

洛谷 P4305:[JLOI2011] 不重复数字 ← unordered_set

【题目来源】 https://www.luogu.com.cn/problem/P4305 【题目描述】 给定 n 个数&#xff0c;要求把其中重复的去掉&#xff0c;只保留第一次出现的数。 【输入格式】 第一行一个整数 T&#xff0c;表示数据组数。 对于每组数据&#xff0c;第一行一个整数 n。第二行 n 个数…

STM32固件升级设计——SPIFLASH模拟U盘升级固件

目录 概述 一、功能描述 1、BootLoader部分&#xff1a; 2、APP部分&#xff1a; 二、BootLoader程序制作 1、分区定义 2、 主函数 3、配置USB 4、配置fatfs文件系统 5、程序跳转 三、APP程序制作 四、工程配置&#xff08;默认KEIL5&#xff09; 五、运行测试 六…

解锁阿里云日志服务SLS:云时代的日志管理利器

引言&#xff1a;开启日志管理新篇 在云计算时代&#xff0c;数据如同企业的血液&#xff0c;源源不断地产生并流动。从用户的每一次点击&#xff0c;到系统后台的每一个操作&#xff0c;数据都在记录着企业运营的轨迹。而在这些海量的数据中&#xff0c;日志数据占据着至关重…

Keye-VL-8B-Preview:由快手 Kwai Keye 团队精心打造的尖端多模态大语言模型

&#x1f525; News 2025.06.26 &#x1f31f; 我们非常自豪地推出Kwai Keye-VL&#xff0c;这是快手Kwai Keye团队精心打造的前沿多模态大语言模型。作为快手先进技术生态中的核心AI产品&#xff0c;Keye在视频理解、视觉感知和推理任务方面表现卓越&#xff0c;树立了新的性…

Web前端之JavaScript实现图片圆环、圆环元素根据角度指向圆心、translate、rotate

MENU 前言效果HtmlStyleJavaScript 前言 代码段创建了一个由6个WiFi图标组成的圆形排列&#xff0c;每个图标均匀分布在圆周上。 效果 Html 代码 <div class"ring"><div class"item"><img class"img" src"../image/icon/W…

1 Studying《Computer Vision: Algorithms and Applications 2nd Edition》11-15

目录 Chapter 11 Structure from motion and SLAM 11.1 几何内禀校准 11.2 姿态估计 11.3 从运动中获得的双帧结构 11.4 从运动中提取多帧结构 11.5 同步定位与建图&#xff08;SLAM&#xff09; 11.6 额外阅读 Chapter 12 Depth estimation 12.1 极点几何 12.2 稀疏…

phpstudy 可以按照mysql 数据库

phpstudy 可以按照mysql 数据库 PHPStudy&#xff08;小皮面板&#xff09;是一款专为开发者设计的集成环境工具&#xff0c;涵盖服务器配置、开发环境搭建、网站部署等多项功能。以下是其核心用途及优势的详细解析&#xff1a; 一、开发环境快速搭建 一站式集成环境集成Apa…

Python搭建HTTP服务,如何用内网穿透快速远程访问?

Python的内置HTTP服务模块是开发者工具箱中的瑞士军刀&#xff0c;只需一行命令即可启动一个功能完备的Web服务器。无论是前端工程师调试页面、数据科学家共享Jupyter Notebook&#xff0c;还是后端开发者快速验证API原型&#xff0c;Python HTTP服务都能以零配置的方式满足需求…

拨号音识别系统的设计与实现

拨号音识别系统的设计与实现 摘要 本文设计并实现了一个完整的拨号音识别系统&#xff0c;该系统能够自动识别电话号码中的数字。系统基于双音多频(DTMF)技术原理&#xff0c;使用MATLAB开发&#xff0c;包含GUI界面展示处理过程和结果。系统支持从麦克风实时录音或加载音频文…

数据结构-树详解

树简介 树存储和组织具有层级结构的数据&#xff08;例&#xff1a;公司职级&#xff09;&#xff0c;就是一颗倒立生长的树。 属性&#xff1a; 递归n个节点有n-1个连接节点x的深度&#xff1a;节点x到根节点的最长路径节点x的高度&#xff1a;节点x到叶子节点的最长路径 …

【安卓Sensor框架-2】应用注册Sensor 流程

注册传感器的核心流程为如下&#xff1a;应用层调用 SensorManager注册传感器&#xff0c;framework层创建SensorEventQueue对象&#xff08;事件队列&#xff09;&#xff0c;通过JNI调用Native方法nativeEnableSensor()&#xff1b;SensorService服务端createEventQueue()创建…

新版本没有docker-desktop-data分发 | docker desktop 镜像迁移

在新版本的docker desktop中&#xff08;如4.42版本&#xff09;&#xff0c;镜像迁移只需要更改路径即可。如下&#xff1a; 打开docker desktop的设置&#xff08;图1&#xff09;&#xff0c;将图2的原来的地址C:\Users\用户\AppData\Local\Docker\wsl修改为你想要的空文件…

EtherCAT SOEM源码分析 - ec_init

ec_init SOEM主站一切开始的地方始于ec_init, 它是EtherCAT主站初始化的入口。初始化SOEM 主站&#xff0c;并绑定到socket到ifname。 /** Initialise lib in single NIC mode* param[in] ifname Dev name, f.e. "eth0"* return >0 if OK* see ecx_init*/ in…

84、原理解析-SpringApplication创建初始化流程

84、原理解析-SpringApplication初始化流程 # SpringApplication创建初始化流程原理解析 SpringApplication的创建和初始化是Spring Boot应用启动的关键步骤&#xff0c;主要包括以下过程&#xff1a; ## 1. 创建SpringApplication实例 ### 1.1 调用构造函数 - 当调用SpringApp…

【数理逻辑】 选择公理与集值映射

目录 选择公理1. 有限指标集 I I I2. 可数无限指标集 I I I &#xff08;简称为 ACC 或 ACω&#xff09;3. 不可数无限指标集 I I I4. 选择公理的层级与数学应用5. 选择公理的深层意义 集值映射的选择函数1. 选择公理的核心作用2. 不同情况下的依赖性分析3. AC 的必要性证明…

微信小程序使用wx.chooseImage上传图片时进行压缩,并添加时间水印

在微信小程序的开发过程&#xff0c;经常会使用自带的api(wx.chooseImage)进行图片拍照或选择图片进行上传&#xff0c;有时图片太大&#xff0c;造成上传和下载时过慢&#xff0c;现对图片进行压缩后上传&#xff0c;以下是流程和代码 一、小程序的版本选择了3.2.5&#xff0…

RAII简介

&#x1f4e6; 一、技术原理简介&#xff1a;RAII是个“托管狂魔” 想象你有个健忘的朋友&#xff0c;每次借东西都会忘记归还。RAII&#xff08;Resource Acquisition Is Initialization&#xff0c;资源获取即初始化&#xff09;就是C派来的“超级管家”&#xff1a; “你负…

微信小程序入门实例_____打造你的专属单词速记小程序

上次通过天气查询小程序&#xff0c;我们初探了微信小程序开发的世界。这次&#xff0c;咱们再挑战一个有趣又实用的项目 ——“单词速记小程序”。无论是学生党备考&#xff0c;还是上班族提升英语&#xff0c;都能用得上&#xff01;接下来就跟着我&#xff0c;一步一步把它做…

gateway白名单存储nacos,改成存储数据库

前言 很久没写博客了&#xff0c;csdn都开始ai润色了&#xff0c;之前都是看相应框架的源码看了个遍&#xff0c;感觉底层原理都差不多&#xff0c;这阵子着手改造了下gateway中的白名单&#xff0c;之前白名单存储到nacos&#xff0c;要改成存到数据库。里面涉及到浅浅的源码…