LinuxC++操作mysql数据库(#include <mysql/mysql.h>的使用)

mysql

安装

1.安装mysql c++库

sudo apt-get install libmysql++-dev
sudo systemctl mysql-server

2.安装mysql

sudo apt-get install mysql-server
sudo apt-get install mysql-client
systemctl status mysql.service #请检是否安装成功

mysql安装
sql语句

使用

  • 进入mysql
sudo mysql -u root -p
  • 创建数据库
CREATE TABLE `users`(`use` VARCHAR(50) NOT NULL COMMENT 'id',`pwd` VARCHAR(50) NOT NULL COMMENT 'passwd',PRIMARY KEY (`use`)
)ENGINE=INNODB DEFAULT CHARSET=utf8INSERT INTO `users`(`use`,`pwd`) VALUES ('aa' , 'bb'),('cc','dd');
  • 常用操作
#include <stdio.h>
#include <list>
#include <mysql/mysql.h>
#include <error.h>
#include <string.h>
#include <iostream>
#include <string>using namespace std;int main()
{MYSQL *con = NULL;con = mysql_init(con);//初始化if (con == NULL){cout << "MySQL Error1";}string url = "localhost";    //主机地址unsigned int Port = 3306;   //数据库端口号string User = "root";   //登陆数据库用户名string PassWord = "123456";  //登陆数据库密码string DBName = "test_databace"; //使用数据库名//链接数据库con = mysql_real_connect(con, url.c_str(), User.c_str(), PassWord.c_str(), DBName.c_str(), Port, NULL, 0);if (con == NULL){cout << "MySQL Error2";}//执行sql语句,如果查询成功,mysql_query()函数会返回0;否则,返回非零值表示发生错误。mysql_query(con , "INSERT INTO `users`(`use`,`pwd`) VALUES ('add' , 'bbb');");mysql_query(con,"select * from users");MYSQL_RES *res;MYSQL_ROW row;//获得执行结果res = mysql_use_result(con);const char * csname = "utf8";mysql_set_character_set(con, csname);//获取字段个数,即查询获得的结果里有几列数据int nums = 0;  nums = mysql_num_fields(res);  //属于表结构的获取cout << nums << endl;MYSQL_FIELD * fields;fields = mysql_fetch_fields(res);  //属于表结构的获取for(int i = 0; i < nums ; i++){cout<<fields[i].name<<"|";}cout<<endl;while( (row = mysql_fetch_row(res)) != nullptr)  //mysql_fetch_row()函数从指定的结果集中获取一行数据返回给row,是数组的形式,即row内部是字符串数组指针(二级指针){for(int i = 0; i < nums; i++){cout<<row[i]<<"|" ;}cout << endl;}mysql_free_result(res);mysql_close(con);
}
  • MYSQL_FILED
typedef struct MYSQL_FIELD {/* 列名 */char *name;/* 列的原始名称,如果该列是别名 */char *org_name;/* 如果列是一个字段,则为该字段所在表的名称 */char *table;/* 表的原始名称,如果表是别名 */char *org_table;/* 表所在的数据库名称 */char *db;/* 表所在的目录(在某些数据库系统中使用) */char *catalog;/* 字段的默认值,由mysql_list_fields设置 */char *def;/* 列的宽度(创建时定义的长度) */unsigned long length;/* 所选数据集中列的最大宽度 */unsigned long max_length;/* 列名的长度 */unsigned int name_length;/* 原始列名的长度 */unsigned int org_name_length;/* 表名的长度 */unsigned int table_length;/* 原始表名的长度 */unsigned int org_table_length;/* 数据库名称的长度 */unsigned int db_length;/* 目录名称的长度 */unsigned int catalog_length;/* 默认值的长度 */unsigned int def_length;/* 分区标志位 */unsigned int flags;/* 小数点后的位数,用于表示数字类型的精度 */unsigned int decimals;/* 字符集编号 */unsigned int charsetnr;/* 字段类型,枚举类型,具体类型参照mysql_com.h中的定义 */enum enum_field_types type;/* 扩展字段,可以用于实现特定扩展功能 */void *extension;
} MYSQL_FIELD;
  • 编译
g++ $(mysql_config --cflags) main.cpp -o main $(mysql_config --libs)
  • cmake
set(CMAKE_CXX_FLAGS "-I/usr/include/mysql")
add_executable(main main.cpp)
target_link_libraries(main -L/usr/lib/x86_64-linux-gnu -lmysqlclient -lzstd -lssl -lcrypto -lresolv -lm)

数据结构

  • MYSQL
typedef struct MYSQL {/* 存储通信参数的结构体,包含网络连接细节 */NET net;/* SSL连接使用的文件描述符指针 */unsigned char *connector_fd;/* 数据库服务器地址字符串指针 */char *host;/* 数据库用户名字符串指针 */char *user;/* 密码字符串指针 */char *passwd;/* Unix域套接字路径字符串指针 */char *unix_socket;/* 服务器版本信息字符串指针 */char *server_version;/* 主机附加信息字符串指针 */char *host_info;/* 连接额外信息字符串指针 */char *info;/* 当前选中的数据库名称字符串指针 */char *db;/* 当前连接的字符集信息结构体指针 */struct CHARSET_INFO *charset;/* 查询结果字段数组指针 */MYSQL_FIELD *fields;/* 用于存储查询结果字段分配的内存管理器结构体 */struct MEM_ROOT *field_alloc;/* 受影响的行数 */uint64_t affected_rows;/* 最后一次插入操作生成的自动增长ID */uint64_t insert_id;/* 未使用的信息字段 */uint64_t extra_info;/* 服务端为该连接分配的线程ID */unsigned long thread_id;/* 数据包长度 */unsigned long packet_length;/* 数据库服务器端口 */unsigned int port;/* 客户端标志位,记录客户端特性 */unsigned long client_flag;/* 服务器能力标志位,记录服务器支持的功能 */unsigned long server_capabilities;/* 协议版本号 */unsigned int protocol_version;/* 查询结果字段数量 */unsigned int field_count;/* 服务器状态标志 */unsigned int server_status;/* 服务器语言设置 */unsigned int server_language;/* 警告计数 */unsigned int warning_count;/* MySQL连接选项结构体 */struct st_mysql_options options;/* 连接当前状态(如已连接、断开等) */enum mysql_status status;/* 结果集元数据获取方式 */enum enum_resultset_metadata resultset_metadata;/* 标记是否在mysql_close时释放此连接资源 */bool free_me;/* 标记是否启用自动重连功能 */bool reconnect;/* 会话级随机字符串,用于身份验证 */char scramble[SCRAMBLE_LENGTH + 1];/* 包含所有声明过的SQL语句的链表 */LIST *stmts;/* 指向一组用于与MySQL交互的方法的结构体 */const struct MYSQL_METHODS *methods;/* 指向MySQL服务器内部线程对象的指针 */void *thd;/* 指向一个布尔标志,用于指示结果集或语句的所有者是否取消了结果集 */bool *unbuffered_fetch_owner;/* 扩展字段,可以用于实现特定扩展功能 */void *extension;
} MYSQL;
  • MYSQL_RES
typedef struct MYSQL_RES {/* 结果集中行的数量 */uint64_t row_count;/* 结果集的字段信息数组指针,每个元素是一个MYSQL_FIELD结构体,描述一个字段 */MYSQL_FIELD *fields;/* 结果数据的实际存储结构体指针,包含记录内容 */struct MYSQL_DATA *data;/* 当前游标指向的结果集中当前行的数据指针 */MYSQL_ROWS *data_cursor;/* 当前行中各个字段值的长度数组,用于变长类型字段 */unsigned long *lengths;/* 指向产生此结果集的MYSQL连接句柄,对于非缓冲读取尤为重要 */MYSQL *handle;/* 结果集操作所使用的特定方法集合,如读取、释放等 */const struct MYSQL_METHODS *methods;/* 未缓冲读取时,指向当前行数据的指针 */MYSQL_ROW row;/* 缓存当前正在处理的行的内部缓冲区 */MYSQL_ROW current_row;/* 用于分配结果集中字段结构的空间的内存管理器 */struct MEM_ROOT *field_alloc;/* 结果集中字段总数 */unsigned int field_count;/* 当前指向的字段索引,在遍历结果集时使用 */unsigned int current_field;/* 标记是否已经到达结果集的末尾(eof:end of file) */bool eof;/* 如果mysql_stmt_close()取消了未完成的非缓冲读取,则设置为真 */bool unbuffered_fetch_cancelled;/* 结果集元数据获取方式 */enum enum_resultset_metadata metadata;/* 扩展字段,可以用于实现特定扩展功能 */void *extension;
} MYSQL_RES;

api

mysql_affected_rows() //返回被最新的UPDATE, DELETE或INSERT查询影响的行数。mysql_close() //关闭一个服务器连接。mysql_real_connect() //连接一个MySQL服务器mysql_change_user() //改变在一个打开的连接上的用户和数据库。mysql_create_db() //创建一个数据库。该函数不推荐;而使用SQL命令CREATE DATABASE。mysql_data_seek() //在一个查询结果集合中搜寻一任意行。mysql_debug() //用给定字符串做一个DBUG_PUSH。mysql_drop_db() //抛弃一个数据库。该函数不推荐;而使用SQL命令DROP DATABASE。mysql_dump_debug_info() //让服务器将调试信息写入日志文件。mysql_eof() //确定是否已经读到一个结果集合的最后一行。这功能被反对;
mysql_errno()mysql_error()可以相反被使用。mysql_errno() //返回最近被调用的MySQL函数的出错编号。mysql_error() //返回最近被调用的MySQL函数的出错消息。mysql_escape_string() //用在SQL语句中的字符串的转义特殊字符。mysql_fetch_field() //返回下一个表字段的类型。mysql_fetch_field_direct() //返回一个表字段的类型,给出一个字段编号。mysql_fetch_fields() //返回一个所有字段结构的数组。mysql_fetch_lengths() //返回当前行中所有列的长度。mysql_fetch_row() //从结果集合中取得下一行。mysql_field_seek() //把列光标放在一个指定的列上。mysql_field_count() //返回最近查询的结果列的数量。mysql_field_tell() //返回用于最后一个mysql_fetch_field()的字段光标的位置。mysql_free_result() //释放一个结果集合使用的内存。mysql_get_client_info() //返回客户版本信息。mysql_get_host_info() //返回一个描述连接的字符串。mysql_get_proto_info() //返回连接使用的协议版本。mysql_get_server_info() //返回服务器版本号。mysql_info() //返回关于最近执行得查询的信息。mysql_init() //获得或初始化一个MYSQL结构。mysql_insert_id() //返回有前一个查询为一个AUTO_INCREMENT列生成的ID。mysql_kill() //杀死一个给定的线程。mysql_list_dbs() //返回匹配一个简单的正则表达式的数据库名。mysql_list_fields() //返回匹配一个简单的正则表达式的列名。mysql_list_processes() //返回当前服务器线程的一张表。mysql_list_tables() //返回匹配一个简单的正则表达式的表名。mysql_num_fields() //返回一个结果集合重的列的数量。mysql_num_rows() //返回一个结果集合中的行的数量。mysql_options() //设置对mysql_connect()的连接选项。
char value = 1;
int iOptions = mysql_options(&this->connObject, MYSQL_OPT_RECONNECT, &value); //解决8小时连接断开问题
if (iOptions != 0) {std::cout << "object mysql_options(MYSQL_OPT_RECONNECT) failed..." << std::endl;
}mysql_ping() //检查对服务器的连接是否正在工作,必要时重新连接。mysql_query() //执行指定为一个空结尾的字符串的SQL查询:
int mysql_query(MYSQL *mysql,const char *query) 返回值:查询成功返回0;查询出现错误返回非0mysql_real_connect() //连接一个MySQL服务器。
if(mysql_real_connect(&conn, "localhost", "mysql_user", "passwd", "database_name", 0, NULL, CLIENT_FOUND_ROWS))
{std::cout << "connect success..." << std::endl;
}mysql_real_query() //执行指定为带计数的字符串的SQL查询。mysql_reload() //告诉服务器重装授权表。mysql_row_seek() //搜索在结果集合中的行,使用从mysql_row_tell()返回的值。mysql_row_tell() //返回行光标位置。mysql_select_db() //连接一个数据库。mysql_shutdown() //关掉数据库服务器。mysql_stat() //返回作为字符串的服务器状态。mysql_store_result() //检索一个完整的结果集合给客户。mysql_thread_id() //返回当前线程的ID。mysql_use_result() //初始化一个一行一行地结果集合的检索。

from


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

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

相关文章

机器学习概论—正则化

机器学习概论—正则化 在开发机器学习模型的过程中,大家一定遇到过模型在训练集上表现不错,但验证精度或测试精度过低的情况。这种情况在机器学习领域通常被称为过度拟合,这也是机器学习从业者最不希望在他的模型中出现的情况。 在本文中,我们将学习一种称为正则化的方法…

ETAS工具链ISOLAR-AB重要概念,RTE配置,ECU抽取

RTE配置界面&#xff0c;包含ECU抽取关联 首次配置RTE&#xff0c;出现需要勾选的抽取EXTRACT 创建System System制作SWC到ECU的Mapping System制作System Data 的Mapping

如何解决ChatGPT消息发不出问题,GPT消息无法发出去,没有响应的问题

前言 今天工作到一半&#xff0c;登陆ChatGPT想咨询一些代码上的问题&#xff0c;结果发现发不了消息了。 ChatGPT 无法发送消息&#xff0c;但是能查看历史的对话。不过首先可以先打开官方的网站&#xff1a;https://status.openai.com/ 。 查看当前Open AI的状态&#xff0…

【动态规划】代码随想录算法训练营第五十一天 | 309.最佳买卖股票时机含冷冻期, 714.买卖股票的最佳时机含手续费,总结(待补充)

309.最佳买卖股票时机含冷冻期 1、题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 2、文章讲解&#xff1a;代码随想录 3、题目&#xff1a; 给定一个整数数组&#xff0c;其中第 i 个元素代表了第 i 天的股票价格 。 设计一个算法计算出最大利润。在满足…

Python安装第三方库

前言&#xff1a;大部分时候我们都是使用pip install去安装一些第三方库&#xff0c;但是偶尔也会有部分库无法安装&#xff08;最典型的就是dlib这个库&#xff09;&#xff0c;需要采取别的方法解决&#xff0c;这里做笔记记录一下。 使用国内镜像源安装 因为pypi的服务器在…

c++_leran

C++基础入门 1 C++初识 1.1 第一个C++程序 编写c++程序分为四步 创建项目 创建文件 编写代码 运行程序 1.1.1 创建项目 我使用的是Visio Stdio2017社区版 1.1.2 新建文件 1.1.3 编写代码 这段是默认的格式 #include<iostream> using namespace std; int main() {…

最新android icon和splashScreen适配兼容至2024android

android在12做了splashScreen的变动&#xff0c;即&#xff0c;android12有自带的screenSplash过渡&#xff0c;不论你是否自己有变化&#xff0c;都会插入该动画。 android8做了icon的巨大变动。13做了图标的主题兼容。 一、icon制作 制作 使用android自带的工具&#xff0…

03:HAL---中断

目录 一:中断 1:简历 2:AFIO 3:EXTI 4:NVIC基本结构 5:使用步骤 6:设计中断函数 二:中断的应用 A:对外式红外传感计数器 1:硬件介绍 2:计数代码 B:旋转编码计数器 1:硬件介绍 2:旋转编码器代码 C:按键控制LED D:代码总结 一:中断 1:简历 中断&#xff1a;在主程序…

第二十二周周报

论文研读&#xff1a;Camera Distance-aware Top-down Approach for 3D Multi-person Pose Estimation from a Single RGB Image 粗读10篇文献。 通过图2 我可以知道这个论文大概实现的这个姿态估计效果的方法&#xff0c;首先是把图片输入到DetectNet网络&#xff0c;该网络…

Python批量提取Word文档表格数据

在大数据处理与信息抽取领域中&#xff0c;Word文档是各类机构和个人普遍采用的一种信息存储格式&#xff0c;其中包含了大量的结构化和半结构化数据&#xff0c;如各类报告、调查问卷结果、项目计划等。这些文档中的表格往往承载了关键的数据信息&#xff0c;如统计数据、项目…

Twitter的分布式自增ID雪花算法snowflake

Twitter的分布式自增ID雪花算法snowflake 一、Twitter的分布式自增ID雪花算法snowflakeendl 一、Twitter的分布式自增ID雪花算法snowflake /*** Twitter的分布式自增ID雪花算法snowflake* SnowFlake的结构如下(每部分用-分开):* 0 - 0000000000 0000000000 0000000000 0000000…

外连接 (outer join)

外连接 (outer join) 左外连结 (left outer join) 右外连结 (right outer join) 全外连结 (full join) 内连接与外连接的区别 内连接操作在表关系的笛卡尔积中去掉了不匹配的数据记录&#xff0c;只输出满足连接条件的数据记录。 在连接语句中只写join&#xff0c;而不写是…

打破信息差,计算机专业必须知道的进大厂的方式

现在的信息茧房有多可怕&#xff0c;如果你提前知道这几个进大厂实习的方法&#xff0c;你将超越百分之九十的大学生。 一、高校就业指导中心 大学生们找实习可以从本校高校就业指导中心网站上找&#xff0c;这个渠道建议重点关注下&#xff0c;此类渠道推荐的实习机会&#…

B2B2C电商系统源代码部署,让你轻松开启网店生意

在当今数字化时代&#xff0c;开设一家网店已经变得异常简单。借助B2B2C电商系统源代码部署&#xff0c;你可以轻松搭建自己的在线商城&#xff0c;开始网店生意。这种系统为企业提供了一个强大的平台&#xff0c;让他们可以直接与制造商和消费者进行交易&#xff0c;从而实现品…

AcWing16. 替换空格

题目 请实现一个函数&#xff0c;把字符串中的每个空格替换成"%20"。 数据范围 0≤0≤ 输入字符串的长度 ≤1000≤1000。 注意输出字符串的长度可能大于 10001000。 样例 输入&#xff1a;"We are happy."输出&#xff1a;"We%20are%20hap…

ETL的数据挖掘方式

ETL的基本概念 数据抽取&#xff08;Extraction&#xff09;&#xff1a;从不同源头系统中获取所需数据的步骤。比如从mysql中拿取数据就是一种简单的抽取动作&#xff0c;从API接口拿取数据也是。 数据转换&#xff08;Transformation&#xff09;&#xff1a;清洗、整合和转…

WebGL开发数字孪生系统

使用WebGL开发数字孪生系统通常涉及以下步骤。WebGL是一种用于在浏览器中实现3D图形渲染的JavaScript API&#xff0c;它可以用于创建交互性强、高度可视化的数字孪生系统。 1.需求分析&#xff1a; 确定数字孪生系统的目标和用途。明确系统的功能需求、用户需求以及与物理实体…

高性能服务系列【六】网络的有效载荷

谈到高性能服务是很难绕开网络部分&#xff0c;毕竟单机时代早已过去。对于多节点构成的服务系统&#xff0c;要提高总体性能&#xff0c;除了单节点足够强悍外&#xff0c;节点之间的通讯代价是必须考虑的关键。我们在刚开始的章节&#xff0c;就谈到网卡和磁盘是挂接在低速南…

Java项目:46 ssm005基于SSM框架的购物商城系统+jsp(含文档)

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 项目是单体ssm电商水果平台&#xff0c;包括前台商城平台及后台管理系统 前台商城系统包含首页门户、商品推荐、商品搜索、商品展示、购物车、订单流…

连接端口和连接端口转换OrCAD补丁

来介绍此功能之前先复习一下一些OrCAD的基础知识。 说到连通两个器件&#xff0c;有什么办法呢&#xff1f;最直接的就是用线连通。比如下面这两个器件需要连通&#xff0c;我们可以直接用线Place wire连接。 但是如果这两个器件由于某些原因&#xff0c;他们之间相隔很远&…