1. 简介
mysql为关系型数据库,是由瑞典的MySQLAB公司开发的,但是几经辗转,现在是Oracle产品。它是以“客户/服务器”模式实现的,是一个多用户、多线程的小型数据库服务器。而且MySQL是开源数据的,任何人都可以获得该数据库的源代码并修正MySQL的缺陷。
2. 优缺点
优点:
1>功能全面,综合化,追求最大并发效率
2>MySQL 支持大部分关系型数据库应该有的 SQL 功能(有些直接支持,有些间接支持)
缺点:
1>不支持热备份
2>安全系统,复杂而非标准,另外只有到调用mysqladmin来重读用户权限时才发生改变
3>没有一种存储过程语言,这是对习惯于企业级数据库的程序员的最大限制。
4>MySQL的价格随平台和安装方式变化。Linux的MySQL如果由用户自己或系统管理员而不是第三方安装则是免费的,第三方案则必须付许可费。Unix或Linux 自行安装 免费 、Unix或Linux 第三方安装收费。
3. 服务器安装
1)下载安装包:
链接地址:https://dev.mysql.com/downloads/windows/installer/8.0.html
2)双击下载后的安装包进行安装:
![在这里插入图片描述](https://img-blog.csdnimg.cn/0583fe61c72d4b58a14889725dc9c14e.png)
(注意navicat不支持使用SHA256加密方式,所以客户端采用navicat时,此项选择传统授权方式)
3)环境变量设置:
4)验证是否安装成功:
查询版本号命令:mysql --version
登录mysql命令:musql -uroot -p123456
5)设置远程连接:
win+R cmd
#登录
mysql -uroot -ppassword
#选择数据库
use mysql;
#设置远程连接
update user set Host=‘%’ where User=‘root’;
#刷新权限
flush privileges
6)用navicat进行连接,并创建数据库-test:
4. 错误处理
1)Navicat 连接MySQL数据库出现错误:2059 - authentication plugin ‘caching_sha2_password’
错误原因:
MySQL新版本(8以上版本)的用户登录账户加密方式是【caching_sha2_password】,Navicat不支持这种用户登录账户加密方式。
解决办法:
#登录
mysql -uroot -ppassword
#选择数据库
use mysql;
#注意:如果是远程连接,请将’localhost’换成’%’
ALTER USER ‘root’@‘localhost’ IDENTIFIED WITH mysql_native_password BY ‘你的数据库密码’;
#刷新权限
FLUSH PRIVILEGES;
2)Driver not loaded错误:
错误原因:
Qt在操作mySql时,会尝试加载对应的插件(即:qsqlmysql.dll 和 qsqlmysqld.dll),但由于这些插件依赖于Mysql的库 (即libmysql.dll),所以当找不到插件或者对应的Mysql库时,就会加载失败。
解决办法:
拷贝mySql安装目录下的libmysql.dll到qt可执行文件目录下,或者拷贝到qt安装目录bin下
5. 使用场景
假设是要满足多用户同一时候访问,或者是站点访问量比较大时使用MYSQL比较合适。
6. 在qt上的简单使用
pro工程文件:QT += sql
main.cpp:
#include <QCoreApplication>
#include <QDebug>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
/*************************
* mysql-查看数据库驱动
**************************/
qDebug() << QSqlDatabase::drivers();
/*************************
* mysql-数据库连接
**************************/
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); //直接通过MySQL的驱动加载数据库
db.setHostName("192.168.8.121"); //数据库服务器IP
db.setPort(3306); //端口
db.setDatabaseName("test"); //数据库名
db.setUserName("root"); //用户名
db.setPassword("123456"); //密码
bool bConnect = db.open();
if (!bConnect)
{
qDebug()<< "Connect mysql server error:" << db.lastError();
return -1;
}
else
qDebug()<< "Connect mysql server success";
QSqlQuery query;
//创建表
bool bCreateTab = query.exec("create table persion(id int primary key auto_increment, "
"name varchar(255), sex int, age int, job varchar(255), country varchar(255))ENGINE=INNODB;");
if (!bCreateTab)
{
qDebug()<< "create table error";
}
else
{
qDebug()<< "create table success";
}
/*************************
* mysql-单行插入数据
**************************/
bool bOk = query.exec("insert into persion(id, name, sex, age, job, country) values(1, 'Jack', 1, 18, 'Programmer', 'China')");
if (!bOk)
{
qDebug()<< "insert into error";
}
/*************************
* mysql-多行插入数据
**************************/
query.prepare("insert into persion(name, sex, age, job, country) values(?,?,?,?,?)"); //?是占位符
QVariantList name;
QVariantList sex;
QVariantList age;
QVariantList job;
QVariantList country;
name << "Mary" << "Mike" << "Bruse";
age << 19 << 20 << 21;
sex << 0 << 1 << 1;
job << "Sale" << "Programmer" << "Programmer";
country << "America" << "England" << "France";
//按顺序给字段绑定相应的值
query.addBindValue(name);
query.addBindValue(sex);
query.addBindValue(age);
query.addBindValue(job);
query.addBindValue(country);
//执行预处理命令
bOk = query.execBatch();
if (!bOk)
{
qDebug()<< "execBatch error";
}
/*************************
* mysql-修改数据
**************************/
bOk = query.exec("update persion set age=22 where name='Mike'");
if (!bOk)
{
qDebug()<< "update error";
}
/*************************
* mysql-查询数据
**************************/
query.exec(QString("select id from persion where name='Jack'"));
if (!bOk)
{
qDebug()<< "select *from error";
}
else
{
if(query.next())
{
qDebug() << query.value("Country");
qDebug() << "job:" << query.value(3);
}
}
/*************************
* mysql-遍历数据
**************************/
bOk = query.exec("select *from persion");
if (!bOk)
{
qDebug()<< "select *from error";
}
else
{
while(query.next())//遍历完为false
{
//方式1:以下标
qDebug()<< "Search way1:"
<< query.value(0).toInt() << query.value(1).toString()
<< query.value(2).toInt() << query.value(3).toInt()
<< query.value(4).toString() << query.value(5).toString();
//方式2:以字段
qDebug()<< "Search way2:"
<< query.value("id").toInt() << query.value("name").toString()
<< query.value("sex").toInt() << query.value("age").toInt()
<< query.value("job").toString() << query.value("country").toString();
}
}
/*************************
* mysql-删除某一行数据
**************************/
/*
bOk = query.exec("delete from persion where name='mary'");
if (!bOk)
{
qDebug()<< "delete error";
}
*/
/*************************
* mysql-清空表数据
**************************/
/*
bOk = query.exec("truncate table student");
if (!bOk)
{
qDebug()<< "truncate table error";
}
*/
/*************************
* mysql-删除表
**************************/
/*
bOk = query.exec("drop table student");
if (!bOk)
{
qDebug()<< "drop table error";
}
*/
/*************************
* mysql-关闭数据库
**************************/
db.close();
return a.exec();
}