Qt5.12.3 如何与 MySQL8.0.30 连接

作者第一次发布文章,可能会有些错误,欢迎大家提醒指正。

目录

相关软件:

问题来源:

拷贝libmysql文件

更改mysql数据库连接方式

总结:


相关软件:

Qt 5.12.3

MySQL 8.0.30

辅助软件:EverythingMySQL Workbench

问题来源:

笔者在实现Qt 5.12.3 与 MySQL 8.0 进行连接时发现,在Qt中直接导入头文件还不行:

#include "mainwindow.h"
#include "ui_mainwindow.h"  
#include "QSqlDatabase"
#include "QSqlQuery"
#include "QSqlError"
#include "QDebug"
#include "QMessageBox"

还需要在Qt 所创建项目中的pro文件中加上

QT       += sql

然后,笔者开始使用数据库,整体内容如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QSqlDatabase"
#include "QSqlQuery"
#include "QDebug"
#include "QMessageBox"
#include "QSqlError"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    qDebug()<<QSqlDatabase::drivers();

    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");//Qt中设置数据库类型为MySQL数据库
    
    db.setHostName("127.0.0.1");//设置为本地主机
    db.setPort(3306);//设置Mysql数据库默认端口为3306
    db.setDatabaseName("sales");//设置数据库名(我们原先在数据库中创建好的)
    db.setUserName("root");//设置登录用户名
    db.setPassword("123456789hr??");//写入该用户密码
    bool ok = db.open();
    if (ok){
        QMessageBox::information(this, "information", "success");
    }
    else {
        QMessageBox::warning(this, "warning", "open failed");
        qDebug()<<"error open database :"<<db.lastError().text();//将错误对象转化为文本字符串
    }


    QStringList drivers = QSqlDatabase::drivers();  //获取现在可用的数据库驱动
    foreach(QString driver, drivers)
    qDebug() << driver;



}

MainWindow::~MainWindow()
{
    delete ui;
}

 Ctrl+R运行后发现如下错误:

21:53:36: Starting C:\Users\Lenovo\Documents\build-MySql_Test-Desktop_Qt_5_12_3_MinGW_32_bit-Debug\debug\MySql_Test.exe ...

("QSQLITE", "QMYSQL", "QMYSQL3", "QODBC", "QODBC3", "QPSQL", "QPSQL7")

QSqlDatabase: QMYSQL driver not loaded

QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QODBC QODBC3 QPSQL QPSQL7

error open database because "Driver not loaded Driver not loaded"

"QSQLITE"

"QMYSQL"

"QMYSQL3"

"QODBC"

"QODBC3"

"QPSQL"

"QPSQL7"

 意思是现在Qt可用的数据库有QSQLITE、QMYSQL、QMYSQL3、QODBC、QODBC3、QPSQL、QPSQL7,显然QMYSQL在里面,应该是可用的,但是却报错“驱动未加载”。

于是笔者查阅大量的资料后发现,部分资料是说未安装QMYSQL驱动,于是笔者按照相关资料重新安装了Qt(还是此版本,只不过多下了一个附件Src文件夹,即源码),然后经过一系列操作(修改pro文件等)对其中的 mysql.pro(在 Src\qtbase\src\plugins\sqldrivers\mysql 中)进行构建、编译,将 qsqlmysql.dll 文件拷贝到Qt D:\Qt\Qt5.12.3\5.12.3\mingw73_32\plugins\sqldrivers目录下然后再次运行,发现仍是报这个错误(这种方法读者很容易网上查阅,感兴趣的可以试试)。

这是因为在Qt 5.12.3版本中自带这些dll文件(而5.12.4不自带),所以当再次编译将生成的qsqlmysql.dll文件放入sqldrivers文件夹时无疑是做无用功。

Qt 5.12.3 的sqldrivers文件夹:

拷贝libmysql文件

笔者又查阅了相关资料,其意思是将MySQL中lib库里面的libmysql.dll文件和libmysql.lib文件复制粘贴至 Qt mingw73_32下的bin文件夹中(D:\Qt\Qt5.12.3\5.12.3\mingw73_32\bin)中,见下图:

MySQL中的lib文件夹

Qt 中的bin文件夹

经一番操作之后,笔者再次运行发现还是出现驱动未加载的错误,于是笔者以为是 Qt 是只有32位版本、而MySQL是64位,以为是两者不兼容问题, 将MySQL中的 connector C++ 删除重新下载与版本相关的x86位 connector C++,并将其dll文件和其他依赖dll文件复制粘贴到 Qt 的 sqldrivers 文件夹中,再次运行后发现还是依旧报这种错误。

一些依赖dll文件

可以不去下载、复制这些dll文件,因为毫无用处,在后面会讲到。

为了解决此类错误,读者耗费近一天时间翻阅相关资料,终于发现是 我们从 MySQL 中复制到 Qt 中的bin文件夹里面的 qsqlmysql.dll 文件出现了错误,可能是MySQL 8.0 及之后的版本安全性大大增加,于是笔者在网上下载了一个 libmysql.dll 文件,将其复制到 Qt 的 bin 文件夹后(D:\Qt\Qt5.12.3\5.12.3\mingw73_32\bin)Qt终于不再报“驱动器未加载”的错误,而是另一种错误。

("QSQLITE", "QMYSQL", "QMYSQL3", "QODBC", "QODBC3", "QPSQL", "QPSQL7")

error open database because "SSL connection error: unknown error number QMYSQL: Unable to connect"

"QSQLITE"

"QMYSQL"

"QMYSQL3"

"QODBC"

"QODBC3"

"QPSQL"

"QPSQL7"

但是这种错误较为容易解决,因为MySQL 8.0及之后的版本安全性大大增加,所以MySQL加密性比较高,其增加了加密方式 caching_sha2_password,连接方式和以前不太一样,这种方式无法链接数据库。

更改mysql数据库连接方式

所以我们只需更改mysql数据库的连接方式为native。

在mysql命令窗口运行:

ALTER USER ‘root’@‘localhost’ IDENTIFIED WITH mysql_native_password BY ‘YourPassword’;
# YourPassword 为数据库中用户 root 的密码

然后找到mysql的配置文件 my.ini 

打开my.ini文件,找到 [mysqld],并在其下面加上

skip_ssl

其中①为新增内容,②中内容是上述更改mysql数据库连接方式的另一种写法,将其前方的#去掉即可,但是笔者试了似乎并没有什么用,所以将其注释掉。

将其保存后,在任务管理器中的服务一栏重启MySQL80即可。

我们重新构建项目,编译运行 Qt 项目文件,结果如图所示。

连接终于成功了!

总结:

总之,关于Qt 5.12.3 版本 对 MySQL 8.0.30版本的连接,只需要做以下几点:

①将MySQL中lib文件夹里的libmysql.dll文件和libmysql.lib文件复制到Qt中的mingw73_32\bin文件夹里。(若无用,替换笔者给出的libmysql.dll文件,见下方链接)

②将MySQL中的连接模式改变为native。

③修改MySQL配置文件my.ini,在[mysqld]一栏下方加入skip_ssl。

④在项目pro文件中加入Qt的sql模块,即 “QT         +=      sql”。

另外需要注意的是,打包Qt项目时,其无法复制libmysql.dll,仍需要将其复制到项目包里。

libmysql.dll文件链接:https://pan.baidu.com/s/1QF0J88eoyeoiwLPyh5DEhw

提取码: m3f6 

### 回答1: 是的,Qt 5.12.3是最后提供MySQL数据库插件的版本。从Qt 5.13开始,官方不再提供MySQL插件的支持。Qt 5.12.3提供了Qt SQL模块的MySQL驱动程序,使得开发者可以通过该驱动程序连接和操作MySQL数据库。MySQL是一个开放源代码的关系型数据库管理系统,它被广泛用于各种类型的应用程序开发。在Qt中使用MySQL数据库可以轻松地进行数据存储和检索操作。然而,随着Qt版本的更新,官方不再支持MySQL插件的更新和维护。这意味着,如果您继续使用最新版本的Qt,您将无法直接使用MySQL插件,而是需要寻找其他的替代解决方案。一种常见的替代方案是使用Qt提供的支持SQLite的数据库驱动程序,或者使用第三方的MySQL驱动程序。这些替代方案可以满足大多数开发者的需求,因为它们提供了类似MySQL的功能和性能。总之,如果您需要在Qt中使用MySQL数据库,就需要考虑使用Qt 5.12.3或之前的版本,并且还要注意MySQL相关插件的维护和更新问题。 ### 回答2: Qt 5.12.3Qt框架的一个版本,是Qt5系列的一个更新版本。在这个版本中,提供了对MySQL数据库的插件支持。 MySQL是一种使用广泛的关系型数据库管理系统,被广泛应用于各种软件开发和数据管理领域。Qt作为一个跨平台的开发框架,致力于提供丰富而强大的功能供开发人员使用,因此在其框架中提供了对MySQL数据库的支持。通过使用Qt提供的MySQL插件,开发人员可以方便地在他们的应用程序中使用MySQL数据库,进行数据的增删改查等操作。 然而,需要注意的是,Qt框架和MySQL数据库各自都在不断地升级和更新。对于Qt 5.12.3来说,它是在发布时提供了MySQL插件支持的最新版本。在此之后的Qt框架的版本,可能会有其他的修改和更新,包括对MySQL插件的一些改进和修复。因此,如果想要使用最新的MySQL插件功能,建议使用Qt最新的版本。 总之,Qt 5.12.3Qt框架中最后提供MySQL数据库插件支持的版本,通过使用这个版本,开发人员可以方便地在他们的应用程序中使用MySQL数据库进行数据管理操作。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值