MySQL学习笔记--C++接口调用

//=============By xiaowei
/*
此帖,是数据库mysql学习总结帖,包括mysql的语句和C++接口。
*/
//======================

1、环境安装

环境安装和基本的启动管理,参考菜鸟教程的文章,链接如下:

参考:菜鸟教程–Windows 上安装 MySQL
链接:http://www.runoob.com/mysql/mysql-install.html

其中,在运行时,出现报错情况
【mysql】You must reset your password using ALTER USER statement before executing this statement.
是由于不能使用临时密码,解决方法

常用命令

#启动
mysqld --console
net start mysql
#关闭
mysqladmin -u root -p shutdown
net stop mysql
#登陆root用户
mysql -u root -p
#创建用户user_name ,密码pass123
CREATE USER user_name IDENTIFIED BY 'pass123';
#删除用户user_name 
DROP USER user_name @'%';
#创建表
CREATE TABLE table_name (column_name column_type);
#查看所有表名
show tables;
#删除表
DROP TABLE table_name ;
#插入数据
INSERT INTO table_name ( field1, field2,...fieldN )
                       VALUES
                       ( value1, value2,...valueN );
#插入多条数据
INSERT INTO table_name  (field1, field2,...fieldN) 
						 VALUES 
						  (valueA1,valueA2,...valueAN),
						  (valueB1,valueB2,...valueBN),									   
						  (valueC1,valueC2,...valueCN)......;
#where子句
SELECT * from runoob_tbl WHERE runoob_author="男";
#where判断,不区分大小写
mysql> SELECT * from runoob_tbl WHERE BINARY runoob_author="男";


修改数据;UPDATE table_name SET field1=new-value1, field2=new-value2
[WHERE Clause]
删除数据;DELETE FROM table_name [WHERE Clause]
如果不加where限定,所有数据都被删除;

LIKE子句实现模糊匹配;一般与%搭配使用,%表示任何字符
SELECT * from runoob_tbl WHERE runoob_author LIKE ‘%COM’;

UNION将两个或以上的数据表中数据粘贴在一起;

ORDER BY子句,设定规则;

JOIN 连接两个表数据;

IS NULL: 当列的值是 NULL,此运算符返回 true。
IS NOT NULL: 当列的值不为 NULL, 运算符返回 true。
<=>: 比较操作符(不同于=运算符),当比较的的两个值为 NULL 时返回 true。
用来判断数据为NULL的时候;

正则表达式:mysql> SELECT name FROM person_tbl WHERE name REGEXP ‘^st’;
REGEXP 操作符,用来标识正则表达式;与Where判断句一同使用;

事务,用来控制一组相关联的数据改动操作的同步性;

ALTER 修改表名或字段;

索引,添加搜索索引,增加搜索效率;

MySQL 临时表在我们需要保存一些临时数据时是非常有用的。但是在退出时,会销毁表并释放空间;
CREATE TEMPORARY TABLE SalesSummary

复制表;
CREATE TABLE targetTable LIKE sourceTable; 复制结构
INSERT INTO targetTable SELECT * FROM sourceTable; 复制数据

服务器元数据;可以获得服务器状态信息;
SELECT VERSION( ) 服务器版本信息
SELECT DATABASE( ) 当前数据库名 (或者返回空)
SELECT USER( ) 当前用户名
SHOW STATUS 服务器状态
SHOW VARIABLES 服务器配置变量

MySQL 序列,使用 AUTO_INCREMENT实现递增序列;
重置序列,
mysql> ALTER TABLE insect DROP id;
mysql> ALTER TABLE insect
-> ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST,
-> ADD PRIMARY KEY (id);

MySQL 处理重复数据,防止出现重复数据;
1、设置主键,插入报错,用IGNORE防止报错;
2、REPLACE 新数据取代旧数据;
3、UNIQUE 设置唯一索引;
读取时过滤重复数据:mysql> SELECT DISTINCT last_name, first_name FROM person_tbl;

MySQL 及 SQL 注入,防止恶意攻击,篡改数据;

MySQL 导出数据
SELECT…INTO OUTFILE语句,输出文件;
#导出为CSV文件
SELECT * FROM classmate INTO OUTFILE 'E:\temp\classmate.txt’FIELDS TERMINATED BY ‘,’ ENCLOSED BY ‘"’ LINES TERMINATED BY ‘\r\n’;
在写出的时候会出现The MySQL server is running with the --secure-file-priv option so it cannot execute this statement的错误解决方法:
出现这个错误是因为没有给数据库指定写出文件的路径或者写出的路径有问题。
首先使用下面的命令 show variables like ‘%secure%’; 查看数据库的存储路径。如果查出的 secure_file_priv 是 null 的时候就证明在 my.ini 文件里面没有配置写出路径。
这时候就可以在 mysql.ini 文件的 [mysqld] 代码下增加 secure_file_priv=E:/TEST 再重启 mysql 就可以了。然后在导出的地址下面写上刚才配置的这个地址 eg: select * from tb_test into outfile “E:/TEST/test.txt”;就可以了。

将数据表及数据库拷贝至其他主机;

MySQL 导入数据
使用 mysqlimport 导入数据

MYSQL的函数和运算符;

C++Connector

官网的C++/Connector提供了C++接口,下载msi程序,并安装,即可;
之后就是配置开发环境,参考:动态库添加方法

使用C++接口

1、搭建mysql,C++编译环境;
2、无法解析的外部符号 _mysql_init@4:原因为64位库,VS项目为32位控制台项目;

解决方法:将项目换成64位项目

3、MySQL动态库添加方法

参考:VS2013添加外部动态库
https://www.cnblogs.com/bokeyuan-dlam/articles/6322711.html

4、调用MySQL库的C++接口

参考:c++使用MYSQL教程
https://blog.csdn.net/xiyangsu2617/article/details/83243948

5、解决读取数据库数据乱码问题
mysql_query( &myconnt, "SET NAMES 'GB2312' ");函数设置输出字符格式。

这是因为vs2010与mysql对宽字符的处理方式不一致导致的问题,通过调用上述函数,可以使其使用同一字符集进行宽字符的处理;

详细解决过程

1、64位控制台项目

在VS的配置管理器》活动解决方案平台》新建》选择X64;

2、MySQL动态库添加方法

此处,我参考菜鸟教程安装mysql后,提供了C++的动态库,路径在安装文件夹下;
我的路径是:C:\web\mysql-8.0.15
VS调用动态库需要用到三个文件.dll .lib .h文件;

  • 首先是包含头文件路径和库路径,即.h文件和.lib文件
    此处的路径在C:\web\mysql-8.0.15\libC:\web\mysql-8.0.15\include
    在这里插入图片描述
  • 链接器增加mysql的库
    此处的附加依赖项新建为libmysql.lib
    在这里插入图片描述
  • 将.dll文件拷贝到工程目录,如果经常用,可以放在C:\Windows\System32中。

3、调用MySQL库的C++接口

参考贴中,调用了C++接口,实现读取数据库功能,在此处,贴出我的代码,详细的解释可以参考我看的帖子,链接在上方。

// TestMYsql.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <WinSock2.h>
#include <mysql.h>
//mysql库是64位库,更换了64位项目;
#pragma comment(lib,"C:/web/mysql-8.0.15/lib/libmysql.lib")
#include<iostream>
#include<string.h>
#include<stdlib.h>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	MYSQL mysql;
	MYSQL_RES  *res;
	MYSQL_ROW row;

	mysql_init(&mysql);
	
	if(!mysql_real_connect(&mysql,"127.0.0.1","root","123456","mysql",3306,0,0))
	{
		cout<<"mysql_real_connect failure!"<<endl;
	}
	mysql_query( &mysql, "SET NAMES 'GB2312' ");
	if(mysql_real_query(&mysql,"select * from classmate",(unsigned long)strlen("select * from classmate")))
	{
		cout<<"mysql_real_query failure!"<<endl;
		return 0;

	}
	res=mysql_store_result(&mysql);
	if(NULL==res)
		cout<<"mysql_store_result failure!"<<endl;
	else
		cout<<"OK"<<endl;
	while(row=mysql_fetch_row(res))
	{
		
		cout<<row[0]<<row[1]<<row[2]<<row[3]<<endl;
	}

	mysql_free_result(res);
	mysql_close(&mysql);

	system("pause");
	getchar();

	return 0;
}


报错问题汇总

进入mysql后,运行指令报错:

【mysql】You must reset your password using ALTER USER statement before executing this statement.
输入如下指令后,可以使用;
alter user user() identified by “123456”;
解决方式如下:

MySQL版本5.7.6版本以前用户可以使用如下命令:
mysql> SET PASSWORD = PASSWORD(‘Xiaoming250’);
MySQL版本5.7.6版本开始的用户可以使用如下命令:
mysql> ALTER USER USER() IDENTIFIED BY ‘Xiaoming250’;
参考:https://blog.csdn.net/muziljx/article/details/81541896

猜你喜欢

转载自blog.csdn.net/stm32_newlearner/article/details/88699645