Qt5.12.3 如何与 MySQL8.0.30 连接

  • Post author:
  • Post category:mysql


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


目录


相关软件:


问题来源:


拷贝libmysql文件


更改mysql数据库连接方式


总结:


相关软件:


Qt 5.12.3


MySQL 8.0.30


辅助软件:Everything



MySQL 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



版权声明:本文为qq_34776808原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。