C/C++ MySQL数据库开发

article/2025/9/30 2:21:01

C/C++ MySQL数据库开发笔记

  • MySQL启动方式
    • 手动启动MySQL数据库:
    • 命令行方式启动MySQL数据库:
  • 配置环境变量
  • MySQL在Linux下安装
    • MySQL的配置文件重要参数设置
  • C/C++ 访问MySQL数据库(MySQL开发环境的配置(MySQL开发头文件和库文件)
  • MySQL 数据库的连接
  • MySQL 数据类型以及对应的 C/C++类型
  • MySQL 命令的执行
  • MySQL 创建用户(MySQL 如何创建新用户)
  • MySQL 创建仓库与删除仓库
  • MySQL 创建表与删除表
  • MySQL 数据插入
  • MySQL 数据删
  • MySQL 数据更新
  • MySQL 数据查询
  • MySQL 数据联表/联合查询
  • MySQL 创建索引
    • 普通索引
    • 唯一索引
  • MySQL 事务
  • MySQL 触发器
    • 什么是触发器
    • 创建触发器
  • MySQL 数据备份与恢复
    • 数据备份
    • 数据恢复
  • MySQL 内置函数
    • 字符串函数
    • 数字函数
    • 日期函数
    • 其他函数

MySQL启动方式

手动启动MySQL数据库:

右击此电脑->管理->服务和应用程序->服务->下拉找到MySQL80(具体看MySQL安装的MySQL版本)->右击启动或者停止

命令行方式启动MySQL数据库:

以管理员身份启动控制台->输入net start命令找到MySQL08->输入net stop MySQL80关闭数据库 或者输入net start MySQL80启动数据库
注:net start命令为当前已经启动服务的命令

配置环境变量

为什么要配置环境变量?
便于我们执行一些命令,不然输入命令会找不到,所以需要配置环境变量
控制面板->系统安全->系统->高级系统设置->高级->环境变量->双击系统变量中的Path->新建->粘贴MySQL的安装路径(C:\Program Files\MySQL\MySQL Server 8.0\bin)
控制台输入:mysql -u root -p 根据提示输入密码
环境变量配置成功的效果
show databases; 命令(显示数据库中的所有数据库)quit 退出

MySQL在Linux下安装

执行:sudoapt-getinstallmysql-server安装服务器(yum)
执行:sudoaptinstallmysql-client安装客户端(用于验证服务器是否安装成功)
执行:sudoaptinstalllibmysqlclient-dev安装开发环境(用于后续开发编程用)

MySQL的配置文件重要参数设置

打开/etc/mysql/mysql.conf.d/mysqld.cnf
修改mysqld.cnf
使用vim进行修改保存后
执行命令:
mysqld–initialize
执行servicemysqlrestart命令,重启mysql
重启mysql
登录测试
首次安装后,root密码默认是空的
可以通过下面的命令来设置密码
mysqladmin-urootpassword“123456”先测试本地的登录
测试本地的登录
显示以上界面,则表示本地登录成功。

C/C++ 访问MySQL数据库(MySQL开发环境的配置(MySQL开发头文件和库文件)

找到MySQL的安装目录,在安装目录下找到lib和include目录,如下图
找到lib和include目录
记录下include和lib的绝对路径,如果是Linux环境,则一般在/usr/include/mysql 在lib下面有这样几个文件
库文件
这三个文件分成两组
mysqlclient.lib一组
libmysql.lib和libmysql.dll一组
mysqlclient.lib相当于静态库
而libmysql.lib和libmysql.dll
相当于动态库引用
而Linux下,则是引用
/usr/lib/x86_64-linux-gnu/libmysqlclient.a
作为静态库引用
或者引用
/usr/lib/x86_64-linux-gnu/libmysqlclient.so
作为动态库引用
为了学习起见,我们后面会使用稍微复杂一些的方式即Windows下的动态库引用方式,来导入开发模块

首先新建一个VS的控制台项目
文件创建好之后,首先选择架构为x64(因为我们前面安装的时候,是x64的安装包)
设置头文件路径
导入包
最好是将include目录复制到当前项目中来
库文件

使用#pragmacomment(lib,“libmysql.lib”)来导入库,将libmysql.dll复制到当前的文件目录下来
在这里插入图片描述
然后在代码中引入头文件

#include <iostream>
#include <mysql>
#pragma comment(lib,"libmysql.lib")
int main()
{int ret = 0;MYSQL* pDB = new MYSQL();mysql_init(pDB);MYSQL* mysql = mysql_real_connect(pDB, "localhost", "root", "123456Qwe", NULL, 3306, NULL, 0);mysql_close(pDB);return 0;
}

MySQL 数据库的连接

连接的过程:

  1. 创建 MYSQL 对象
  2. 初始化 MYSQL 对象
  3. 连接数据库
  4. 增删改查操作
  5. 关闭数据库操作

初始化 MYSQL 对象函数

MYSQL *STDCALL mysql_init(MYSQL *mysql);

连接数据库函数

MYSQL *STDCALL 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 clientflag);

参数:
mysql:初始化过的 MYSQL 对象
host:服务器地址[ip、localhost、域名]
user:连接服务器所使用的用户
passwd:用户对于的密码
db:连接服务器时所使用的库,如果为空,则使用默认数据库 mysql
port:连接服务器所用的端口,默认是 3306,具体依据数据库来定
unix_socket:unix 套接字连接方式,一般是指本地管道或者本地套接字,如果没有设为 NULL clientflag:一般情况下为 0,除非你知道你要干什么,否则不要使用下面的内容: CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS 客户端可以处理过期的密码 CLIENT_COMPRESS 在协议中进行数据压缩
CLIENT_FOUND_ROWS 返回匹配的结果,而非更改的结果
CLIENT_IGNORE_SIGPIPE 抑制管道信号的处理,防止与已有的管道信号处理冲突 CLIENT_IGNORE_SPACE 允许函数名称后面的空格
CLIENT_INTERACTIVE 使用 interactive_timeout 来设置超时时间,而不是通过 wait_timeout 函 数来得知超时
CLIENT_LOCAL_FILES 允许加载本地数据处理
CLIENT_MULTI_STATEMENTS 告诉服务器客户端可能发送多个 statements CLIENT_NO_SCHEMA 不允许 db_name.tbl_name.col_name 这样的语法(用于兼容 ODBC) CLIENT_ODBC 没有用了(以前兼容 odbc 用的)
CLIENT_OPTIONAL_RESULTSET_METADATA 针对高频而短小的查询优化(但是可能导致其他问 题)
CLIENT_SSL 使用加密协议。官方不建议使用,最好使用 mysql_options() 或者 mysql_ssl_set() 来替换。
CLIENT_REMEMBER_OPTIONS 这个是为了方便 connect 失败后,重新连接的时候用的。如果 有这个,options 设置一次后,如果失败,可以直接使用 connect,而不必再次调用 options
实操代码:

// An highlighted block
MYSQL* mysql = new MYSQL();
//MYSQL mysql;//占用的是栈上的内存
MYSQL* pDB = mysql_init(mysql);
if (pDB == NULL) {std::cout << "mysql_init failed!" << std::endl; return -1; 
}
pDB = mysql_real_connect(pDB, "localhost", "root", "123456Qwe", "mysql", 3306, NULL, 0);std::cout << pDB << std::endl;
if (pDB) {std::string sql = ""; int ret = mysql_real_query(pDB, sql.c_str(), sql.size()); if (ret != 0) { std::cout << "mysql error:" << mysql_error(pDB) << std::endl; }mysql_close(pDB);
}
delete mysql;

MySQL 数据类型以及对应的 C/C++类型

MySQL 中的数据类型(INTEGER、DECIMAL、DATETIME)
INTEGER:TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT
对应的 C/C++类型:char、short、int、int、int64_t
DECIMAL:FLOAT、DOUBLE、DECIMAL
对应的 C/C++类型:float、double、double==long double
DATETIME:DATE、TIME、YEAR、DATETIME、TIMESTAMP
对应的 C/C++类型:struct tm、tm、int、tm、time_t

struct tm { int tm_sec; // seconds after the minute - [0, 60] including leap second int tm_min; // minutes after the hour - [0, 59] int tm_hour; // hours since midnight - [0, 23] int tm_mday; // day of the month - [1, 31] int tm_mon; // months since January - [0, 11] int tm_year; // years since 1900int tm_wday; // days since Sunday - [0, 6]int tm_yday; // days since January 1 - [0, 365]int tm_isdst; // daylight savings time flag
};

MySQL 中的数据类型(TEXT、BLOB)
TEXT:NCHAR、CHAR、NVARCHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT 对应的 C/C++类型:unsigned char*、char*、unsigned char*、char*、char[256]、string、string、 string
BLOB:BLOB、TINYBLOB、MEDIUMBLOB、LONGBLOB 对应的 C/C++类型:char*
注:并没有一个标准的方法来转换 MySQL 数据到 C/C++的数据类型。

MySQL 命令的执行

执行命令的过程:

  1. 发送 SQL 命令。
  2. 获取 SQL 执行结果 。
  3. 解析获取到的结果。

发送 SQL 命令接口:

int STDCALL mysql_real_query(MYSQL *mysql, const char *q, unsigned long length);

q 是 SQL 指令
length 是指令的长度
向 MySQL 服务器发送 SQL 指令
获取 SQL 执行结果接口:

MYSQL_RES *STDCALL mysql_use_result(MYSQL *mysql);

释放结果接口:

void STDCALL mysql_free_result(MYSQL_RES *result);

获取结果集列的数量:

unsigned int STDCALL mysql_num_fields(MYSQL_RES *res);

获取结果集行的数量:

my_ulonglong STDCALL mysql_num_rows(MYSQL_RES *res);

取结果中的行接口:

MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result);

获取每一行的长度接口:

unsigned long *STDCALL mysql_fetch_lengths(MYSQL_RES *result);

获取结果集中每一列的定义接口:

MYSQL_FIELD *STDCALL mysql_fetch_fields(MYSQL_RES *res);

MySQL 创建用户(MySQL 如何创建新用户)

操作的数据库:mysql
创建指令:
CREATE USER ‘用户名’@‘范围’ IDENTIFIED BY ‘密码’;
范围包括:ip、localhost、%
ip 即只能从指定地址登录
localhost 即只能从本机登录
% 即可以从任何地址登录
光创建用户,并没有什么作用,还需要授权操作表

GRANT privileges ON databasename.tablename TO '用户名'@'范围

privileges 可以是:
SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER,EXECUTE,INDEX,REFERENCES ALTER ROUTINE,CREATE ROUTINE,CREATE TEMPORARY,SHOW VIEW,LOCK TABLES ALL
databasename 是库的名称,可以填入表示所有
tablename 是表的名称,可以填入
表示所有
有授权自然有撤销权限

REVOKE 权限 ON databasename.tablename FROM '用户名'@'范围

实操代码:

MYSQL* mysql = new MYSQL();
//MYSQL mysql;//占用的是栈上的内存
MYSQL* pDB = mysql_init(mysql);
if (pDB == NULL) {std::cout << "mysql_init failed!" << std::endl;return -1;
}
pDB = mysql_real_connect(pDB, "localhost", "root", "123456Qwe", "mysql", 3306, NULL, 0);
std::cout << pDB << std::endl;
if (pDB) {std::string sql = "CREATE USER 'hello'@'localhost' IDENTIFIED BY '123456'";int ret = mysql_real_query(pDB, sql.c_str(), (unsigned long)sql.size());if (ret != 0) { std::cout << "mysql error:" << mysql_error(pDB) << std::endl; }MYSQL_RES* result = mysql_use_result(mysql);if (result != NULL) {unsigned nFields = mysql_num_fields(result); my_ulonglong nRows = mysql_num_rows(result);MYSQL_FIELD* fields = mysql_fetch_fields(result); for (unsigned i = 0; i < nRows; i++) { MYSQL_ROW row = mysql_fetch_row(result);if (row != NULL) {for (unsigned j = 0; j < nFields; j++) {std::cout << "type:" << fields[j].type << " " << fields[j].name << ":" << row[j] << std

http://chatgpt.dhexx.cn/article/qjY5AhXF.shtml

相关文章

1、 数据库开发规范

第1章 数据库开发规范的制定 数据库设计步骤&#xff1a; 1、数据结构设计&#xff1a;逻辑设计-》物理设计 2、实际工作中&#xff1a;逻辑设计物理设计 3、物理设计&#xff1a;表名字段名字段类型 数据库设计几个规范&#xff1a; 数据库命名规范、数据库基本设计规范…

数据库开发-2-开发数据库的要点

Lec2-开发数据库的要点 1. 开发成功数据库应用的特点 需要理解数据库体系结构需要理解锁和并发控制特性&#xff1a;每个数据库都以不同的方式实现最重要的是不要把数据库当"黑盒" 要了解每一个数据库的体系结构和特征最常见的问题就是因为我们对数据库本身了解不足…

数据库开发(Sqlite)

1、数据库开发 1.1 数据与数据管理 什么是信息&#xff1f;   信息是指对现实世界存在方式或运动状态的反应。 什么是数据&#xff1f;   数据是指存储在某一媒体上&#xff0c;能够被识别的物理符号&#xff1b;   数据的概念在数据处理领域已经被大为拓宽&#xff0c…

《软件测试的艺术》第4章:测试用例的设计-白盒测试

写在前面&#xff1a;原书中包含白盒测试、黑盒测试、错误猜测、测试策略四个小节&#xff0c;涵盖内容较多&#xff0c;因此按章节拆分叙述。 《软件测试的艺术》&#xff1a; 白盒测试--语句覆盖 语句覆盖的用例设计原则&#xff1a;将程序中的每条语句至少执行一次。 白盒…

《软件测试的艺术》读后感 Or 读书笔记

《软件测试的艺术》读后感 Or 读书笔记 第一章 一次自评价测试第二章 软件测试的心理学和经济学第三章 代码检查、走查与评审第四章 测试用例的设计第五章 模块&#xff08;单元&#xff09;测试第六章 更高级别的测试第七章 可用性&#xff08;或用户体验&#xff09;测试第八…

软件测试的艺术 学习笔记

文章目录 4.2黑盒测试4.2.1 等价划分4.2.2 边界值分析4.2.3 因果图 4.3 错误猜测4.4 测试策略 5. 模块(单元&#xff09;测试5.1 测试用例设计5.2 增量测试5.3 自顶向下测试与自底向上测试5.3.1 自顶向下的测试5.3.2 自底向上的测试5.3.3 比较 5.4 执行测试 6 更高级别的测试6.…

《软件测试的艺术》第六章 更高级别的测试

《软件测试的艺术》第六章 更高级别的测试 6.0 前言软件开发过程模型 6.1 功能测试6.2 系统测试6.2.1 能力测试6.2.2 容量测试6.2.3 强度测试6.2.4 可用性测试6.2.5 安全性测试6.2.6 性能测试6.2.7 存储测试6.2.8 配置设置6.2.9 兼容性/转换测试6.2.10 安装测试6.2.11 可靠性测…

模块测试(单元测试)——软件测试的艺术

是大型程序测试的第一个步骤【大型程序即超过500条语句的程序】 了解 模块测试是对程序中的单个程序、子程序/过程进行测试的过程【并非对整个程序】&#xff1a; 关注点在较小单元&#xff0c;是一种管理组合的测试元素的手段减轻调试的难度&#xff0c;把错误定位到一个小…

《软件测试的艺术》第1章:一次自评价测试

写在前面&#xff1a; 相比于芯片验证&#xff0c;软件测试有着悠久的历史沉淀和更为完整的生态&#xff0c;和芯片验证在某些方面上几乎有着相同的思路和方法。因此从软件测试的视角出发&#xff0c;重新思考芯片验证的方方面面。第一个系列为《软件测试的艺术》学习。 第一…

9年测试老鸟:Glenford J编写《软件测试的艺术》PDF,高清中文版

内容简介 本书以一次自评价测试开篇&#xff0c;从软件测试的心理学和经济学人手&#xff0c;探讨了代码检查、走查与评审、测试用例的设计、模块(单元)测试、系统测试、调试等主题&#xff0c;以及极限测试、因特网应用系统测试等高级主题&#xff0c;全面展现了作者的软件测…

系统测试——软件测试的艺术

系统测试有着特定的目的&#xff1a;将系统或程序与其初始目标进行比较&#xff0c;给定目标后有两含义&#xff1a; 系统测试不局限于系统&#xff0c;若产品是一个程序&#xff1a;系统测试就是试图说明程序作为一个整体是如何不满足其目标的过程根据定义&#xff0c;若产品…

《软件测试的艺术》重点记录

----定义---- 测试是为发现错误而执行程序的过程。 测试提高了程序的可靠性或质量。 ----测试方法---- 黑盒测试&#xff1a;又称之为数据驱动的测试或输入/输出驱动的测试。 白盒测试&#xff1a;对程序的逻辑结构进行检查&#xff0c;从中获取测试数据。 ----测试的原则…

软件测试的艺术(测试工程师必备基本知识与概念)

目录&#xff1a; 一、黑盒测试与白盒测试&#xff1a; 等价类划分&#xff1a; 一、确定等价类 确定等价类是选取每一个输入条件&#xff08;通常是规格说明中的一个句子或短语&#xff09;并 将其划分为两个或更多的组。可以使用图 4-3 中的表格来进行划分。注意&#xff0…

《软件测试的艺术》第五章 模块(单元)测试

目录 5.0 前言 5.1 测试用例设计 5.2 增量测试 5.3 自顶向下测试和自底向上测试 5.4 执行测试 5.5 小结 5.0 前言 大型的软件程序需要特别的测试对策。在本章中我们会探讨构建大型程序测试的第一个步骤&#xff1a;模块测试&#xff08;单元测试&#xff09;&#xff0c…

软件测试的艺术_读书笔记(一)

软件测试的艺术是测试人员必看书&#xff0c;两年前看这本书给我很多理论和指导&#xff0c;现在重新看&#xff0c;按照个人的理解&#xff0c;整理一些学习笔记。 第一章 软件测试的心理学和经济学 最重要的一句话 &#xff1a; 测试人员的态度比实际测试过程本身更重要 1.…

【读书笔记】-《软件测试的艺术》

2018年10月13日23:24:26 自诩&#xff1a; 因为上一东家工作的原因而接触测试。原本本职是嵌入式软件&#xff0c;因为公司正在风口浪尖的阶段&#xff0c;就是一种小公司要发展成为大公司而经历的那种痛&#xff0c;全公司上下都忙得焦头烂额的这样的背景下&#xff0c;我从软…

《软件测试的艺术》第2章:软件测试的心理学和经济学

软件测试的心理学 书中此部分首先辨析了两个概念&#xff1a;软件测试的定义、成功的测试和不成功的测试。 软件测试的定义&#xff1a; 测试是为发现错误而执行程序的过程&#xff0c;我们应当假设程序是存在bug的&#xff1b;由于证明程序不存在错误的过程是一项看起来不…

《软件测试的艺术》读书笔记

1 一次自评价测试 所谓软件测试&#xff0c;就是一个过程或一系列过程&#xff0c;用来确认计算机代码完成了其应该完成的功能&#xff0c;不执行其不该执行的功能。 2 软件测试的心理学和经济学 2.1 软件测试的心理学 软件测试是为发现错误而执行程序的过程。 2.2 软…

精读-软件测试的艺术之模块测试及更高级别的测试

本文是关于精读书籍《软件测试的艺术》的一些学习笔记和分享 本书共有九章包括测试思想&#xff08;心理&#xff0c;经济&#xff09;&#xff0c;代码检查&#xff0c;测试用例设计&#xff0c;模块测试&#xff0c;更高级别的测试&#xff0c;调试&#xff0c;极限测试和因…

软件测试,浅析这项黑色艺术的难与易

今天给各位同行们带来一本技术好书《软件测试的艺术》&#xff08;原书第3版&#xff09;&#xff0c;让我们一起来赏析这本经典著作吧&#xff01; 本书是国内很多软件测试书籍的首要参考书目&#xff0c;短小精悍的篇幅、深入浅出的内容很适合初学者作为入门首选。同时&…