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

13.使用C连接mysql

sudo useradd 用户名 - - - 创建用户
sudo passwd 用户名 - - - 创建密码

使用C连接mysql,一般在装mysql服务的时候都会自动安装好连接的包。
查看:
ls /usr/include/mysql - - - 查看头文件是否存在
ls /lib64/mysql - - - 查看动静态库是否存在
如果不存在,使用 yum install mysql-devel 安装一下

选项:-L 指定去哪里找这个库 -l 找哪个库
测试:库是否能够使用,调用成功返回库的版本。
在这里插入图片描述

在linux中如果不能直接删除,需要按住crl再进行删除

常用的库函数:
打开数据库操作模块:
MYSQL* my = mysql_init(nullptr); - - - 生成mysql库这个结构体进行操作。
关闭数据库操作模块:
mysql_close(my); - - - 每次使用musql时必须先打开,然后进行操作,最后关闭。

连接数据库:
MYSQL *mysql_real_connect(
MYSQL *mysql, // 创建的mysql结构体
const char *host, // 登陆的地点
const char *user, // 登录的用户
const char *passwd, // 登陆的密码
const char *db, // 连接哪个数据库
unsigned int port, // mysql的端口号
const char *unix_socket, // 设置为null
unsigned long clientflag // 设置为null
);
在这里插入图片描述

操作:
int mysql_query(my, sql语句) - - - 这里的sql语句为char字符串风格,不用带分号,返回0表示成功。
设置编码语言为utf8,不然利用编码插入汉字时,就会出现插入乱码
mysql_set_character_set(myfd, “utf8”);
sql语句只要写好,就可以利用该方法增删改。以下以insert为例:
在这里插入图片描述

查找:select
查找的话,单单一个语句是不能够进行查询的。因为语句只能保证操作成功,要是你想看到得把信息提取出来。
查询语句如果成功,他会将信息放到创建的my结构体中,需要利用函数将信息从my中提取出来
利用:MYSQL_RES* mysql_store_result(my); - - - 提取信息,提取出来的res 的每一行都是数据中的一行。但是这种还不好查看,因此需要再利用函数将他的每一行提取出来。
信息被提取到res后,使用完成后也需要释放res的空间:
mysql_free_result(res); - - - 释放res的空间
利用:
my_ulonglong mysql_num_rows(MYSQL_RES *res); - - - 提取行数
unsigned int mysql_num_fields(MYSQL_RES *res); - - - 提取列数
然后知道行数和列数后,利用函数将每一行整体拿出来。只需要让行数从0开始自增,他自己会拿出对应行的数据,不用你去选择拿哪一行。
MYSQL_ROW row = mysql_fetch_row(res); - - - 拿出这一行的数据
row代表这一行,然后只需要按照列将值打印就行 row[列]

拿到信息后,还想知道它对应的每一个信息的属性,包含表的属性,表的列名,表在那个库等等,所有的属性都打包成一个结构体。
利用函数获取属性结构体:
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);
因为打印表的信息只关心列名和每一列的数据,因此在属性结构体中选择列名打印:
在这里插入图片描述

完整代码:

#include <iostream>
#include <string>
#include <mysql/mysql.h>
#include <unistd.h>using namespace std;
const string host = "127.0.0.1";
const string user = "ghc";
const string passwd = "123456";
const string db = "conn";
const unsigned int port = 3306;
int main()
{MYSQL* my = mysql_init(nullptr);if(my == nullptr){std::cerr << "int 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)==nullptr){std::cerr << "connect Mysql error" << std::endl;return 2;}mysql_set_character_set(my, "utf8");// 查询: 查询语句如果成功,他会将信息放到创建的my结构体中,需要利用函数将信息从my中提取出来string sql = "select * from user";int n = mysql_query(my, sql.c_str());cout << n << endl;MYSQL_RES* res = mysql_store_result(my); //提取信息if(res == nullptr) {cerr << "mysql_store_result 提取失败" << endl;return 4;}// 提取到数据,利用res和函数获取行和列int rows = mysql_num_rows(res); // 获取行树int fields = mysql_num_fields(res); // 获取列数cout << "行:" << rows << endl;cout << "列:" << fields << endl;// 获取属性信息,他是一个结构体包含name在内的所有属性,MYSQL_FIELD* fields_array = mysql_fetch_fields(res);for(int i=0; i<fields; i++){// filelds_array是一个表的所有属性的结构体,因此需要在结构中选择namecout << fields_array[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;}// 插入的方法,删除和修改也这样写都ok// string sql3 = "insert into user (name, age, tephone) values('武松', 20, 66666)";// int n3 = mysql_query(my, sql3.c_str());// cout << n3 << endl;// string sql1 = "insert into user (name, age, tephone) values('tom', 18, 12345)";// string sql2 = "insert into user (name, age, tephone) values('jerry', 8, 54345)";// int n1 = mysql_query(my, sql1.c_str());// int n2 = mysql_query(my, sql2.c_str());// if(n1 == 0) cout << sql1 << " success " << endl;// else cout << "sql1 filed" << endl;// if(n2 == 0) cout << sql2 << " success " << endl;// else cout << "sql2 filed" << endl;mysql_free_result(res);mysql_close(my);return 0;
}
http://www.lryc.cn/news/600114.html

相关文章:

  • Jenkins中出现pytest: error: unrecognized arguments: --alluredir=report错误解决办法
  • 栈----1.有效的括号
  • 机器学习 KNN 算法,鸢尾花案例
  • 从Taro的Dialog.open出发,学习远程控制组件之【事件驱动】
  • C++ 多线程同步机制详解:互斥锁、条件变量与原子操作
  • Python Multiprocessing 进程池完全教程:从理论到实战
  • 数据结构(3)单链表
  • [尚庭公寓]14-找房模块
  • Canal 1.1.7的安装
  • 习题5.6 “数学黑洞“
  • PHP插件开发中的一个错误:JSON直接输出导致网站首页异常
  • 纸板留声机:用ESP32和NFC打造会唱歌的复古装置
  • 手语式映射:Kinova Gen3 力控机械臂自适应控制的研究与应用
  • 秒收蜘蛛池解析机制的原理
  • PPIO上线阿里旗舰推理模型Qwen3-235B-A22B-Thinking-2507
  • ATR2652SGNSS全频段低噪声放大器
  • PostgreSQL对象权限管理
  • GPU 驱动安装升级测试
  • [NPUCTF2020]ReadlezPHP
  • CSS 盒子模型学习版的理解
  • C语言第 9 天学习笔记:数组(二维数组与字符数组)
  • ODFM(正交频分复用)系统中加入汉明码(Hamming Code)的主要目的是增强抗误码能力,通过**前向纠错(FEC)**机制提高传输可靠性
  • KNN算法:从原理到实战全解析
  • Kubernetes深度解析:企业级容器编排平台的核心实践
  • 内存 管理
  • LeetCode 233:数字 1 的个数
  • ACL:访问控制列表
  • 大数据中心——解读60页IDC云数据中心机房运维服务解决方案【附全文阅读】
  • MMRotate ReDet ReFPN 报错 `assert input.type == self.in_type`
  • Linux的磁盘存储管理实操——(下二)——逻辑卷管理LVM的扩容、缩容