作者第一次发布文章,可能会有些错误,欢迎大家提醒指正。
    
     目录
    
   
    相关软件:
   
    
     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
 
