- 数据库相关感念
数据库:是一个用来存储各种数据的容器。
数据库管理系统:专门用于创建和管理数据库的统一软件,介于应用和操作系统之间,比如MySql Sql_Server Oracle等等;他们不仅有基础的数据管理能力,还能保证数据的完整性、安全性和可靠性。
数据库应用程序:通过数据管理系统提供的接口,访问和管理数据的应用程序。
SQL语言:它是一种数据库查询语言和程序设计语言,主要用来管理数据库中的数据,如存储数据、查询数据、更新数据和删除数据等。
本篇使用的数据库为MySql,下载地址:
https://downloads.mysql.com/archives/community/ - 数据库的安装
第一步:设置环境变量
将你解压后放置的文件里边的bin目录加入到path中。例如:D:\mysql-8.0.12-winx64\bin
第二步:配置初始化my.ini
在D:\mysql-8.0.12-winx64\中创建添加my.ini,内容如下(根据自己实际情况更改):
[mysqld]
# 设置3306端口
port=3306
# 设置mysql的安装目录
basedir=D:\\mysql-8.0.12-winx64 # 切记此处一定要用双斜杠\\,单斜杠我这里会出错。
# 设置mysql数据库的数据的存放目录
datadir=D:\\mysql-8.0.12-winx64\\data # 此处同上
# 允许最大连接数
max_connections=30
# 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统
max_connect_errors=10
# 服务端使用的字符集默认为UTF8
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件认证
default_authentication_plugin=mysql_native_password
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8
第三步:初始化及安装
1.以管理员(必须)身份运行cmd命令,并将路径换到mysql的bin目录下
2. 初始化数据库,运行命令:mysqld --initialize --console,这时会产生一个mysql的临时密码,我们要记下该密码,保存一下,登录和改密码要用:
A temporary password is generated for root@localhost: tnylBrV34VR
3 安装服务,运行命令:mysqld --install [服务名] 其中服务名可以不写,默认是mysql ,至此mysql就安装完毕了
4.接下来我们用刚才的临时密码将我们的root用户密码改成我们容易记且安全的!用命令: mysqladmin -uroot -ptnylBrV34VR password 123
安装过程中可能出现的问题,有可能以前安装过,或者初始化后我们换了目录,这是mysql服务会启动失败,我们只需要将windows注册表中的如下项的路径该成我们新路径就可以了:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MySQL
- 数据库的基本操作
在操作之前,我们先来看看什么是数据库,什么是表,mysql实际是一个数据库管理工具,我们先来看一下我们安装的mysql下的data目录,如下图:
接下来开始操作数据库:
登录数据库:输入命令mysql -uroot -p后回车输入密码即可登录数据库
查看数据库:输入show databases; 后回车可以查看到有如下几个数据库
可以看到数据库对应的是data目录下的文件夹,接下来我们用use命令来选中mysql数据库use mysql;
查询用户信息表:select * from user;可以看到一堆的用户信息,我们可以将表理解为文件夹下的文件,它存放了我们的对应信息;
接下来我们使用 create database test;创建一个test数据库,再用show databases;查看数据库如下:
我们再进入data目录,可以看到在data目录下创建了一个空文件夹:
查看数据库信息: show create database test;
改变字节集:alter database test default character set gbk collate gbk_bin;
可以将gbk换成utf8就能改回来默认utf8字符集;
删除数据库:drop database test;
记下来我们先创建数据库再创建一张userinfo 的表:
create database test;
use test;
create table userinfo (id int, name varchar(80), age int);
查看表:show tables;
看到我们创建的表如下:
切换到我们的data目录下,打开我们的数据库文件夹test,看到里面有一个userinfo.ibd文件,我们可以用二进制查看软件打开,看一看里面放的些什么,可以看到除了一些字节填值以外,其他字节都是清零的。
查看表信息:show create table userinfo;
改表名: alter table userinfo rename user;
查看表结构:desc user;
修改字段:alter table user modify id int(6);
修改字段名:alter table user change id userid int(3);
添加字段:alter table user add new int(12);
查看表数据:
select * from 表名;
为表中所有字段添加数据:
insert into 表名(字段1,字段2,…) values(值1, 值2, …)
更新字段:
update 表名 set 字段=值 where 条件;
删除数据:
delete from 表名 where 条件表达式
下面我们建立一个基于对话框的MFC工程连接并操作数据库,调试时我们可以用show processlist;命令查看连接状况;由于64位问题太多,这里我们将mysql的libmysql.lib和libmysql.dll换成32位的来用32位编译,并且设置静态库和头文件的路径。我们程序效果如下,
当点击按钮能查出数据库结果并弹出对话框显示
我们在XXXXDlg.cpp文件中添加头文件及包含库如下代码,XXXX为新建的工程名,对应自己的文件;
#include "WinSock2.h" //mysql用soket区连接数据库,所以包含此头文件
#include "mysql.h" //包含mysql头文件
#pragma comment (lib, "libmysql.lib")
在testButton的点击事件处理函数如下:
void CConnectMySqlDlg::OnBnClickedButton1()
{
//定义MYSQL结构体指针,这里我们可以F12跟进去看一下
MYSQL *pMySql;
MYSQL_RES *res;
//初始化mysql,让其给我们分配结构体空间
pMySql = mysql_init(NULL);
if (pMySql == NULL){
AfxMessageBox(_T("mysql_init failed!"));
return;
}
//与mysql数据库进行连接
if (!mysql_real_connect(pMySql, "127.0.0.1", "root", "123456", NULL, 3306, NULL, 0)){
AfxMessageBox(_T("mysql_real_connect failed!"));
return;
}
if (mysql_select_db(pMySql, "test") != 0){
AfxMessageBox(_T("mysql_select_db failed!"));
return;
}
if (mysql_query(pMySql, "select * from user;") != 0){
AfxMessageBox(_T("mysql_query failed!"));
return;
}
//存储结果
res = mysql_store_result(pMySql);
if (res == NULL){
AfxMessageBox(_T("res failed!"));
return;
}
MYSQL_FIELD *field;
//查询字段
for (int i = 0; field = mysql_fetch_field(res); i++){
AfxMessageBox(CString(field->name));
}
MYSQL_ROW row;
CString str;
//查询内容
mysql_set_character_set(pMySql, "utf16");
while (row = mysql_fetch_row(res)){
str.Format(_T("查询结果:字段1:%s, 字段2:%s,字段3:%s,字段4:%s"), CString(row[0]), CString(row[1]), CString(row[2]), CString(row[3]));
AfxMessageBox(CString(str));
}
//资源清理
mysql_close(pMySql);
mysql_free_result(res);
}