本地安装MySQL数据库以及在Qt中的使用

本地安装 MySQL 过程

1. 安装 MySQL

下载地址:

MySQL 官网:https://dev.mysql.com/downloads/mysql/

Windows 可以选择两种:msi 和 zip,以下过程是 zip 方法:

2. 新建配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[mysqld]
# 设置3306端口
port=3306
# 设置mysql的安装目录 ----------是你的文件路径-------------
basedir=H:\mysql-9.1.0-winx64
# 设置mysql数据库的数据的存放目录 ---------是你的文件路径data文件夹自行创建
# 设置 mysql数据库的数据的存放目录,MySQL 8+ 不需要以下配置,系统自己生成即可,否则有可能报错
#datadir=H:\mysql-9.1.0-winx64\data
# 允许最大连接数
max_connections=200
# 允许连接失败的次数。
max_connect_errors=10
# 服务端使用的字符集默认为utf8mb4
character-set-server=utf8mb4
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8mb4
[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8mb4

3. 初始化 MySQL 数据库

1
2
3
4
5
6
7
H:\mysql-9.1.0-winx64\bin>mysqld --initialize --console
2024-12-25T07:24:13.742985Z 0 [System] [MY-015017] [Server] MySQL Server Initialization - start.
2024-12-25T07:24:13.747449Z 0 [System] [MY-013169] [Server] H:\mysql-9.1.0-winx64\bin\mysqld.exe (mysqld 9.1.0) initializing of server in progress as process 18948
2024-12-25T07:24:13.761946Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2024-12-25T07:24:13.938955Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2024-12-25T07:24:15.411887Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: -M6xjww6A:jl
2024-12-25T07:24:17.307449Z 0 [System] [MY-015018] [Server] MySQL Server Initialization - end.

先复制好这个初始化密码:M6xjww6A:jl

1
2024-12-25T07:24:15.411887Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: -M6xjww6A:jl

如果已经初始化删除 data 目录重新初始化即可。

4. 安装 MySQL 服务并启动

1
mysqld --install mysql

5. 启动 MySQL 服务

1
net start mysql

6. 连接 MySQL

1
mysql -u 用户名 -p

首次登录:回车后输入初始化化密码即可

1
2
3
4
5
6
7
8
9
10
11
12
13
H:\mysql-9.1.0-winx64\bin>mysql -uroot -p
Enter password: ************
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 9.1.0

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

7. 修改密码

连接完成后才能修改密码:

1
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';

8. 断开连接

1
2
3
quit 
or
exit

9. 常用命令

命令后记得加上分号。

显示数据库列表

1
show databases;	 

创建数据库

1
create database database_name;	

建表

1
create table table_name(value_name value_form, value_name value_form, ...);	

查看表字节段(查看值的属性)

1
desc table_name;	

查看表中内容

1
select * from table_name;	

10. 修改为手动启动

image-20241226162111749

Qt 使用

1. 编译驱动

MySQL 安装完成之后,将 H:\mysql-9.1.0-winx64\lib 下的 libmysql.dll 文件复制粘贴到对应的 Qt 安装目录下的 C:\Qt\Qt5.14.2\5.14.2\mingw73_64\bin ,看你用什么编译器,另外需要注意 MySQL 和编译器的位数要相同。

image-20241225163213239

pro 文件中添加

1
QT       += sql

连接数据库得代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
void chart::connect() {
// 连接数据库
db = QSqlDatabase::addDatabase("QMYSQL", "connection"); // 需要使用的数据库驱动和联检建立的名称
db.setHostName("localhost");
db.setUserName("root"); // 数据库用户 // 修改
db.setPassword("123456"); // 用户密码 // 修改
db.setDatabaseName("student"); // 需要用到的数据库 // 修改
if(!db.open()) {
qDebug() << "open failed...";
} else {
qDebug() << "open successfully...";
}
}

连接时发现出现错误:

1
2
3
4
5
6
QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QODBC QODBC3 QPSQL QPSQL7
open failed...
QSqlQuery::exec: database not open
QSqlQuery::prepare: database not open
QSqlError("", "Driver not loaded", "Driver not loaded")

原因是:未能加载 QMYSQL 驱动

使用 Qt sql 模块来操作 MySQL 数据库,需要三个库文件来支持,分别为:libmysql.dllqsqlmysql.dllqsqlmysqld.dll ,三个文件缺一不可。

QT5.15.2 连接MySQL 驱动问题解决方案,无论菜鸟🐦️还是老鸟🦜,解决了就是好鸟🦚 - bluejade2024 - 博客园 (cnblogs.com)

好像是低版本 Qt 没有编译 mysql 驱动,所以 C:\Qt\Qt5.14.2\5.14.2\mingw73_64\plugins\sqldrivers 目录下没有 qsqlmysql.dllqsqlmysqld.dll,只有以下三个文件:

image-20241225160615720

所以需要手动进行编译,打开 C:\Qt\Qt5.14.2\5.14.2\Src\qtbase\src\plugins\sqldrivers\mysqlmysql.pro 工程,进行以下一些修改:

修改 qsqldriverbase.pri 文件:

image-20241225161526609

修改 mysql.pro 文件:

image-20241225162047205

接着就可以编译了,编译后得到以下文件:

image-20241225162130818

将这两个文件复制粘贴到 C:\Qt\Qt5.14.2\5.14.2\mingw73_64\plugins\sqldrivers 目录下即可。

2. 配置Qt项目

.pro 工程文件添加:

1
QT       += sql

添加头文件:

1
2
3
4
5
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>

#include <QMessageBox> // 调试使用

3. 连接MySQL数据库

3. 1. 加载MySQL驱动

1
2
3
4
5
// 单个数据库
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");

// 多个数据库指定名称
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", "数据库的名称");

3.2. 设置数据库连接参数

1
2
3
4
db.setHostName("localhost");
db.setDatabaseName("your_database_name");
db.setUserName("your_username");
db.setPassword("your_password");

3.3. 打开数据库连接

1
2
3
4
if (!db.open()) {
QMessageBox::critical(nullptr, "Database Error", db.lastError().text());
return;
}

4. 数据库操作

4.1. 插入数据(增)

1
2
3
if (!query.exec("INSERT INTO your_table (column1, column2) VALUES ('value1', 'value2')")) {
QMessageBox::critical(nullptr, "Insert Error", query.lastError().text());
}

4.2. 删除数据(删)

1
2
3
if (!query.exec("DELETE FROM your_table WHERE column1 = 'some_value'")) {
QMessageBox::critical(nullptr, "Delete Error", query.lastError().text());
}

4.3. 更新数据(改)

1
2
3
if (!query.exec("UPDATE your_table SET column1 = 'new_value' WHERE column2 = 'some_value'")) {
QMessageBox::critical(nullptr, "Update Error", query.lastError().text());
}

4.4. 查询数据(查)

1
2
3
4
5
6
7
8
9
QSqlQuery query;
if (query.exec("SELECT * FROM your_table")) {
while (query.next()) {
QString data = query.value("column_name").toString();
// 处理查询结果
}
} else {
QMessageBox::critical(nullptr, "Query Error", query.lastError().text());
}

5. 示例代码

修改数据库名称和账号密码。数据库需要先在命令行创建:

1
2
3
net start mysql
mysql -u 用户名 -p
create database test;

接着使用一下代码运行:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <QApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QMessageBox>

int main(int argc, char *argv[]) {
QApplication app(argc, argv);

QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("localhost");
db.setDatabaseName("test");
db.setUserName("root");
db.setPassword("123456");

if (!db.open()) {
QMessageBox::critical(nullptr, "Database Error", db.lastError().text());
return -1;
}

QMessageBox::information(nullptr, "标题", "Open Sucessfully");

return app.exec();
}

运行完成出现弹窗:Open Sucessfully,即为成功。