当前位置:   article > 正文

C/C++ MySQL数据库开发_c++数据库开发

c++数据库开发

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

MySQL 数据库的连接

连接的过程:

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

初始化 MYSQL 对象函数

MYSQL *STDCALL mysql_init(MYSQL *mysql);
  • 1

连接数据库函数

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);
  • 1
  • 2
  • 3
  • 4

参数:
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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

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 1900
	int tm_wday; // days since Sunday - [0, 6]
	int tm_yday; // days since January 1 - [0, 365]
	int tm_isdst; // daylight savings time flag
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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);
  • 1

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

MYSQL_RES *STDCALL mysql_use_result(MYSQL *mysql);
  • 1

释放结果接口:

void STDCALL mysql_free_result(MYSQL_RES *result);
  • 1

获取结果集列的数量:

unsigned int STDCALL mysql_num_fields(MYSQL_RES *res);
  • 1

获取结果集行的数量:

my_ulonglong STDCALL mysql_num_rows(MYSQL_RES *res);
  • 1

取结果中的行接口:

MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result);
  • 1

获取每一行的长度接口:

unsigned long *STDCALL mysql_fetch_lengths(MYSQL_RES *result);
  • 1

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

MYSQL_FIELD *STDCALL mysql_fetch_fields(MYSQL_RES *res);
  • 1

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

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

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

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 '用户名'@'范围
  • 1

实操代码:

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/663312
推荐阅读
相关标签
  

闽ICP备14008679号