Windows下MySQL安装配置及libmysql的使用

2023-11-10

Windows下MySQL安装配置及libmysql的使用

1、安装配置

请参考:Mysql安装配置

2、API文档

libmysql API文档地址

3、示例代码

本示例代码使用了mysql_stmt_xxx接口;

运行本代码需要提前创建好vsdemo数据库以及testsql及testsql2表才可运行;
在这里插入图片描述
在这里插入图片描述

visual studio 配置
在这里插入图片描述
或使用#pragma comment(lib,“libmysql.lib”)添加到代码中

#include <iostream>
#include "mysql.h"
#define STRING_SIZE 50

//UTF-8到GB2312的转换
std::string U2G(const char* utf8)
{
	int len = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);
	wchar_t* wstr = new wchar_t[len + 1];
	memset(wstr, 0, len + 1);
	MultiByteToWideChar(CP_UTF8, 0, utf8, -1, wstr, len);
	len = WideCharToMultiByte(CP_ACP, 0, wstr, -1, NULL, 0, NULL, NULL);
	char* str = new char[len + 1];
	memset(str, 0, len + 1);
	WideCharToMultiByte(CP_ACP, 0, wstr, -1, str, len + 1, NULL, NULL);
	if (wstr) delete[] wstr;
	std::string retStr = str;
	if (str) delete[] str;
	return retStr;
}

//GB2312到UTF-8的转换
std::string G2U(const char* gb2312)
{
	int len = MultiByteToWideChar(CP_ACP, 0, gb2312, -1, NULL, 0);
	wchar_t* wstr = new wchar_t[len + 1];
	memset(wstr, 0, len + 1);
	MultiByteToWideChar(CP_ACP, 0, gb2312, -1, wstr, len);
	len = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, NULL, 0, NULL, NULL);
	char* str = new char[len + 1];
	memset(str, 0, len + 1);
	WideCharToMultiByte(CP_UTF8, 0, wstr, -1, str, len, NULL, NULL);
	if (wstr) delete[] wstr;
	std::string retStr = str;
	if (str) delete[] str;
	return retStr;
}

int main()
{
    std::cout << "Hello World!\n";
	MYSQL *con;
	MYSQL_RES *res;
	MYSQL_ROW row;
	char tmp[400] = {0};
	// 用户名
	char dbuser[32] = "root";
	char dbpasswd[32] = "admin";// 密码
	char dbip[32] = "localhost";// IP
	char dbname[32] = "vsdemo";// 数据库名称
	char tablename[32] = "testsql";// 表名称
	int rt;
	unsigned int t;
	int count = 0;
	// 初始化数据库
	con = mysql_init((MYSQL*)0);
	// 连接数据库
	if ((con != nullptr) && mysql_real_connect(con, dbip, dbuser, dbpasswd, dbname, 3306, nullptr, 0)) 
	{
		std::cout << "连接成功" << std::endl;
	}
	else {
		std::cout << "连接失败" << std::endl;
		return -1;
	}
    // 使用real_query简单的运行insert语句
	//sprintf_s(tmp, "insert into testsql (id,name) values (2,'lisi')");
	//rt = mysql_real_query(con, tmp, strlen(tmp));
	//if (rt) {
	//	std::cout << "error making query: " << mysql_error(con) << std::endl;
	//}
	//else {
	//	std::cout << "success executed" << std::endl;
	//	mysql_commit(con);
	//}
    
    // 使用STMT方式执行
	MYSQL_STMT *stmt;
	MYSQL_BIND    bind[3];
	unsigned long str_length;
	unsigned long str_length1;
	char name[STRING_SIZE];
	char status1[STRING_SIZE];
	char status2[STRING_SIZE];
	int status3;

	MYSQL_STMT *stmt2;
	MYSQL_BIND bind2[2];
	unsigned long length1;
	unsigned long length2;
	char info[STRING_SIZE];
	char info2[STRING_SIZE];
	//std::string info2;

	stmt = mysql_stmt_init(con);
	stmt2 = mysql_stmt_init(con);
	if (!stmt || !stmt2) {
		std::cout << "init stmt error" << std::endl;
		return -1;
	}

	char itmp[512] = "insert into testsql (name,status1,status2,status3) VALUES(?,?,'test',?)";
	if (mysql_stmt_prepare(stmt, itmp, strlen(itmp))) {
		std::cout << "mysql_stmt_prepare error " << mysql_stmt_error(stmt) << std::endl;
		return -1;
	}
	char itmp2[512] = "insert into testsql2 (info,info2) VALUES(?,?)";
	if (mysql_stmt_prepare(stmt2, itmp2, strlen(itmp2))) {
		std::cout << "mysql_stmt_prepare error " << mysql_stmt_error(stmt2) << std::endl;
		return -1;
	}
	int param_count = mysql_stmt_param_count(stmt);
	std::cout << "param_count : " << param_count << std::endl;
	memset(bind, 0, sizeof(bind));
	bind[0].buffer_type = MYSQL_TYPE_STRING;
	bind[0].buffer = (char*)name;
	bind[0].buffer_length = STRING_SIZE;
	bind[0].is_null = 0;
	bind[0].length = &str_length;

	bind[1].buffer_type = MYSQL_TYPE_STRING;
	bind[1].buffer = (char*)status1;
	bind[1].buffer_length = STRING_SIZE;
	bind[1].is_null = 0;
	bind[1].length = &str_length1;

	bind[2].buffer_type = MYSQL_TYPE_LONG;
	bind[2].buffer = (char*)&status3;
	bind[2].is_null = 0;
	bind[2].length = 0;

	memset(bind2, 0, sizeof(bind2));
	bind2[0].buffer_type = MYSQL_TYPE_STRING;
	bind2[0].buffer = (char*)info;
	bind2[0].buffer_length = STRING_SIZE;
	bind2[0].is_null = 0;
	bind2[0].length = &length1;

	bind2[1].buffer_type = MYSQL_TYPE_STRING;
	bind2[1].buffer = (char*)info2;
	bind2[1].buffer_length = STRING_SIZE;
	bind2[1].is_null = 0;
	bind2[1].length = &length2;

	if (mysql_stmt_bind_param(stmt, bind)) {
		std::cout << "mysql_stmt_bind_param error " << mysql_stmt_error(stmt) << std::endl;
	}
	if (mysql_stmt_bind_param(stmt2, bind2)) {
		std::cout << "mysql_stmt_bind_param error " << mysql_stmt_error(stmt) << std::endl;
	}
	strncpy(name, G2U("张三三").c_str(), STRING_SIZE);
	str_length = strlen(name);
	strncpy(status1, G2U("这是一个测试字符").c_str(), STRING_SIZE);
	str_length1 = strlen(status1);
	status3 = 12;
	if (mysql_stmt_execute(stmt)) {
		std::cout << "mysql_stmt_execute error " << mysql_stmt_error(stmt) << std::endl;
	}

	strncpy(info, G2U("this is一个测试的info").c_str(), STRING_SIZE);
	length1 = strlen(info);
	strncpy(info2, G2U("info2也是用来测试的").c_str(), STRING_SIZE);
	length2 = strlen(info2);
	//info2 = G2U("info2也是用来测试的");
	//length2 = info2.size();
	if (mysql_stmt_execute(stmt2)) {
		std::cout << "mysql_stmt_execute error " << mysql_stmt_error(stmt) << std::endl;
	}

	strncpy(name, G2U("李世石").c_str(), STRING_SIZE);
	str_length = strlen(name);
	strncpy(status1, G2U("这还是一个测试文本段").c_str(), STRING_SIZE);
	str_length1 = strlen(status1);
	status3 = 12;
	if (mysql_stmt_execute(stmt)) {
		std::cout << "mysql_stmt_execute error " << mysql_stmt_error(stmt) << std::endl;
	}
	auto affected_rows = mysql_stmt_affected_rows(stmt);
	std::cout << "affected_rows: " << std::endl;
	if (mysql_stmt_close(stmt)) {
		std::cout << "mysql_stmt_close error " << mysql_stmt_error(stmt) << std::endl;
	}

	memset(tmp, 0, sizeof(tmp));
	sprintf_s(tmp, "select * from testsql");
	rt = mysql_real_query(con, tmp, strlen(tmp));
	if (rt) {
		std::cout << "error making query: " << mysql_error(con) << std::endl;
	}
	else {
		std::cout << "success executed " << tmp << std::endl;
	}
	res = mysql_store_result(con);
	while (row = mysql_fetch_row(res)) {
		for (t = 0; t < mysql_num_fields(res); ++t) {
			std::cout << U2G(row[t]).c_str() << "\t";
		}
		std::cout << std::endl;
		++count;
	}

	std::cout << "number of rows " << count << std::endl;
	mysql_free_result(res);
	mysql_close(con);


	return 0;
}

4、为什么使用预处理STMT?

上面的示例代码中,我们发现预处理STMT代码又长又易出错;而使用real_query(注释地方)语句简短且方便阅读理解。

解释:

上述的示例代码没法显现出预处理STMT的优势。对于多次执行的语句,预处理执行比直接执行快,主要原因在于,仅对查询执行一次解析操作。在直接执行的情况下,每次执行语句时,均将进行查询。此外,由于每次执行预处理语句时仅需发送参数的数据,从而减少了网络通信量。

预处理机制特点:

  • 减少服务器负荷
  • 提高服务器响应的速度
  • 可以提供参数机制,让客户有更多查询方法
  • 预处理机制数据类型

故而在我们处理大量数据的时候如批量导入、批量update的时候推荐使用预处理STMT方式。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows下MySQL安装配置及libmysql的使用 的相关文章

  • 检测计算机何时解锁 Windows

    我用过这个优秀的方法 https stackoverflow com questions 20733441 lock windows workstation using python 20733443锁定 Windows 计算机 那部分工作
  • mysql-如何向列申请补助?

    用户名 撤销对数据库的选择 Person I set GRANT SELECT id ON database Person TO username localhost 不是工作 gt SELECT secret FROM Person Go
  • PHP 绑定“bigint”数据类型(MySQLi 准备好的语句)

    studentId 57004542323382 companyOfferId 7 sql INSERT INTO studentPlacement companyOfferId studentId VALUES if stmt db gt
  • Hibernate 对集合的查询过滤器

    我想执行以下查询 from Item i where i categoryItems catalogId catId 然而 这会产生以下异常 非法尝试取消引用集合 所以我用谷歌搜索 找到了这个 Hibernate 论坛帖子https for
  • 截断 Mysql 表 Cron 作业?

    我在如何使用 cron 作业截断 Mysql 表时遇到了一些麻烦 无论我尝试什么 我似乎都无法让数据库清除表格 感谢您的帮助 mysql uderp example pexample hlocalhost Dexample e TRUNCA
  • 如何在Mysql中仅将不同的值从一个表复制到另一个表?

    我有一个大约 2 5GB 的 MySql 数据库 表 A 具有以下列 anoid query date item rank url 我刚刚创建了另一个仅包含列的表 b query and date 我想在查询列中插入所有不同的记录 及其各自
  • Git 扩展 - 无法在 Windows 上推送到网络驱动器中的 git bare 存储库

    我正在 Windows 上学习 git 我已经安装了 Git 扩展 版本 2 47 3 并使用了它 我在我的 C 单元中创建了一个裸存储库 作为中央存储库 并在硬盘中的其他任何位置创建了个人存储库 我对硬盘中的这两个存储库进行提交 推送和拉
  • Apache、PHP 和 MySQL 可移植吗?

    我可以在外部硬盘上运行 Apache PHP 和 MySQL 吗 我需要这个 因为我在不同的地方工作 计算机 有时我没有安装和配置所有使用的应用程序 当然可以 XAMPP http www apachefriends org en xamp
  • 自定义波特率,redux

    我遇到的问题详述如下自定义波特率 https stackoverflow com questions 7714060 custom baud rate SetCommState 波特率 921600 失败 但波特率 115200 成功 尽管
  • 忽略重复条目并在 EF Core 中的 DbContext.SaveChanges() 上提交成功条目

    我有一个 ASP Net Core 2 2 Web API 在我的一个控制器操作中 我向 MySQL 数据库表添加了一堆行 我使用的是 Pomelo 例如 dbContext AddRange entities dbContext Save
  • 游戏内的java.awt.Robot?

    我正在尝试使用下面的代码来模拟击键 当我打开记事本时 它工作正常 但当我打开我想使用它的游戏时 它没有执行任何操作 所以按键似乎不起作用 我尝试模拟鼠标移动和点击 这些动作确实有效 有谁知道如何解决这个问题 我发现这个问题 如何在游戏中使用
  • MySQL连接字符集问题

    我在 Mac 上使用带有 MySQL 的 velosurf 没有任何编码问题 但是当我切换到 Linux 计算机时 从 velosurf 获得的值未正确编码 我发现这可能是默认连接字符集的问题 在 Mac 上我得到 mysql gt sho
  • 如何在批处理文件中回显换行符?

    如何从批处理文件输出中插入换行符 我想做类似的事情 echo hello nworld 这会输出 hello world Use echo hello echo echo world
  • gem install mysql:无法构建 gem 本机扩展 (Mac Lion)

    我为 Mac OS X Lion 安装了 MySQL 5 5 27 来自 dmg 现在我尝试安装 mysql gem gem install mysql Building native extensions This could take
  • Mysql 将 int 转换为 MAC

    我有一些数据可以转换 其中有 2 列 其中一列有 IP 它包含整数值 我在 mysql 查询中使用了以下函数 是否有一个函数可以用来转换我的 mac 列 其中包含整数和数据类型是bigint to MAC地址 SELECT INET NTO
  • 对于多重继承,使用隐式转换而不是 QueryInterface() 是否合法?

    假设我有一个类实现两个或多个 COM 接口 正如here https stackoverflow com questions 1742848 why exactly do i need an explicit upcast when imp
  • Bugzilla 中分离客户端的基本权限

    我正在尝试配置一个 Bugzilla 实例 这将允许我的客户登录并为其正在开发 维护的网站提交错误 例如 我创建了 2 个名为 TestProject TestProject2 的产品和一个名为 TestClient 的用户 我想要实现的是
  • 同一配置文件上的两个不同提供程序

    我在用着实体框架 6 1 0 I have 2 家提供者 MysqlClient 和 SQLServerCE 我需要创建2个不同的DBContext 这迫使我创造2个配置类因为mysql有一些不同的东西 但是当我初始化应用程序时 Datab
  • 映射 mysql 中同一个表的多个值

    您好 我必须使用另一个表中的值 id 获取文本值 表 1 包含值 ID 表 2 包含名称和值 ID 表 1 SEVERITY OCCURENCE DETECTABILITY 2 3 4 表 2 id name value 1 Very Hi
  • SetCurrentDirectoryW 中的错误 206

    在我之后之前不清楚的问题 https stackoverflow com questions 44389617 long path name in setcurrentdirectoryw 我以某种方式能够创建一个具有长路径名的目录 但是

随机推荐

  • 【一网打尽】独立重复事件——常见概率分布

    文章目录 定义 伯努利 Bernouli 试验 n重伯努利试验 伯努利过程 泊松 Poisson 过程 概率分布的意义 0 1分布 伯努利分布 二项 Binomial 分布 负二项 NegativeBinomial 分布 几何 Geomet
  • 区块链的数据结构(一)——区块、链

    区块 区块 block 由区块头 block header 和交易列表 transaction list tx list 组成 block之间通过block header的hash连接成了一个链表结构 但这个链表不同于普通链表 1 bloc
  • JAVA根据PDF文件生成图片

    PDF文件生成图片 实现功能 根据上传的PDF文件 生成图片文件 单页PDF 生成图片文件 多页PDF 则生成zip压缩包 一 文件生成效果 二 引入所需maven依赖 项目采用springboot框架
  • python学习1.2字符串

    一 给变量赋值字符串的时候 要用引号引起来 可以用单引号或者双引号 1 输入 message hello world print message 输出 hello world 2 输入 message hello world print m
  • Java操作ElasticSearch相关内容

    Java连接ES 创建Maven工程 导入依赖
  • 常用遥感SIF和GPP数据集

    一 综述文章 总结一下数据和文章 害怕时间久了忘了 前两篇介绍了SIF 最后一篇介绍了光合作用 1 Remote sensing of solar induced chlorophyll fluorescence SIF in vegeta
  • 【车辆检测】基于背景差分法实现道路行驶车辆检测附matlab代码

    1 简介 该方法的基本思想是 将采集到的车辆图像的每一帧都与一个不含运动车辆的静止参考帧做差值运算 从而突出目标图像 通过分析与处理对车辆计数 其优点是算法简单 处理速度快 且差分结果能直接反应运动目标的位置 形状以及大小等 实用性较强 其
  • css flex布局 —— 容器属性 align-content

    align content 属性定义了多根轴线的对齐方式 如果项目只有一根轴线 该属性不起作用 如果只有一根轴线 align content 几乎等同于 align items 容器属性 align content 生效的条件是 必须显式的
  • 高校校园网使用的认证客户端常见故障自查- 神州数码客户端

    神州数码客户端常见故障自查 一 客户端认证成功前故障 1 接上网线后网卡灯不亮 确定自己电脑网卡带灯 注 测试期间最好是不要接交换机 直接接墙上端口 参考方案 A 更换网线 B 如确认是端口故障 则请致电网络中心报修等待人过来维修 2 如果
  • (每日一练)MATLAB生成斐波那契数和数列

    今天 我学习的内容是利用MATLAB生成斐波那契数 先来介绍一下 斐波那契数列最初是用来解决兔子问题的 问题如下 一个人把一对兔子放在一个四面被墙包围的地方 假设每对兔子每个月都生一对新兔子 不 考虑伦理问题 那么一年可以从这对兔子中生产多
  • C/C++中__builtin_popcount()的使用及原理

    这个函数功能 返回输入数据中 二进制中 1 的个数 对于不同的使用类型 可以采用采用以下函数 builtin popcount int builtin popcountl long int builtin popcountll long l
  • Python列表推导式

    列表推导式 列表推导式使用非常简洁的方式来快速生成满足特定需求的列表 代码具有非常强的可读性 语法形式为 expression for expr1 in sequence1 if condition1 for expr2 in sequen
  • nginx之头部变量x_forwarded_for

    proxy add x forwarded for变量包含客户端请求头中的 X Forwarded For 与 remote addr两部分 他们之间用逗号分开 举个例子 有一个web应用 在它之前通过了2个nginx转发 即用户访问该we
  • P1518 [USACO2.4]两只塔姆沃斯牛 The Tamworth Two

    题目描述 两只牛逃跑到了森林里 Farmer John 开始用他的专家技术追捕这两头牛 你的任务是模拟他们的行为 牛和 John 追击在10 10 的平面网格内进行 一个格子可以是 一个障碍物 两头牛 它们总在一起 或者 Farmer Jo
  • 如何有效使用渲染农场?防止渲染出错的7个方法!

    如何使用渲染农场 又如何有效地使用渲染农场 使用云渲染农场时出错怎么办 众所周知我们可以在任意的笔记本或者终端PC上面来创作 3ds Max 场景 但是实际渲染是这样吗 其实不然 这其中的差距不是一星半点 只能说很可能会有两种不同的呈现 而
  • HTML+CSS+JS列表式视频播放页面

    HTML CSS JS列表式视频播放页面 无插件 应该没有 效果图 html
  • 31 Qt 之绘图之绘制一个漂亮的圆及圆弧

    一 圆形 经常地 我们会在网上看到一些列的抽奖活动 里面就有圆盘抽奖 是不是有点手痒了O O 效果 void MainWindow paintEvent QPaintEvent QPainter painter this painter s
  • 三英战SQL:解析NoSQL的可靠性及扩展操作

    摘要 NoSQL的高性能 易扩展及可靠性一直深受数据工作者的喜爱 然而对比传统关系型数据库NoSQL的优势究竟又在何处 Esen Sagynov在DZone上发布了一篇文章 从运行方面分析Cassandra HBase以及MongoDB产品
  • SVN 执行清理命令,提示清理以下路径失败,并可能有乱码的解决方法

    SVN 执行清理命令 提示清理以下路径失败 并可能有乱码的解决方法 参考文章 1 SVN 执行清理命令 提示清理以下路径失败 并可能有乱码的解决方法 2 https www cnblogs com aidegongyang p 830374
  • Windows下MySQL安装配置及libmysql的使用

    Windows下MySQL安装配置及libmysql的使用 1 安装配置 请参考 Mysql安装配置 2 API文档 libmysql API文档地址 3 示例代码 本示例代码使用了mysql stmt xxx接口 运行本代码需要提前创建好