記錄:Qt5.12+VS2019編譯32位MYSQL8.0驅動

第零步,說明

從Qt5.12.4(待驗證)版本開始Qt就沒帶MYSQL的驅動了,需要自己編譯。我也是折騰了好久才成功了,特此記錄。

第一步,安裝MYSQL8.0

我是在官網下載的最新版本的*.msi安裝程序,裝完才發現數據庫是64位,但是connector可以是32位的。此外,編譯Qt MYSQL驅動需要C的connector而不是C++的。因爲我Qt是32位,所以還需要裝x86的C connector。

打開MYSQL installer安裝管理程序,點擊右側【add】並添加C的connector組件安裝上就行了。

(2020-05-17補充)最近又打開看了下,installer裏C的connector不見了,不過也可以直接去網上搜C鏈接器的下載鏈接。

可能有些版本沒有這個C的驅動,可以自己單獨下載裝上:https://downloads.mysql.com/archives/c-c/

MYSQL官網鏈接:https://dev.mysql.com/downloads/mysql/

Qt相關文檔:https://doc.qt.io/qt-5/sql-driver.html#qmysql

第二步,使用QtCreator編譯MYSQL驅動插件

我先是根據Qt官網的文檔使用命令行,結果發現可能我的環境變量沒弄好沒法用,還是參照百度上的博客用QtCreator來編譯。

首先,打開源碼MYSQL插件的工程(我的路徑E:\Qt\qt-everywhere-src-5.12.4\qtbase\src\plugins\sqldrivers\mysql)。

然後,修改pro文件,去掉QMAKE_USE這一行,把MYSQL的C庫添加進來:

#QMAKE_USE += mysql

INCLUDEPATH +="C:/Program Files (x86)/MySQL/MySQL Connector C 6.1/include"
LIBS +="C:/Program Files (x86)/MySQL/MySQL Connector C 6.1/lib/libmysql.lib"

然後構建。(2020-06-11補充)構建可能會提示 Project ERROR: msvc-version.conf loaded but QMAKE_MSC_VER isn't set。直接去安裝目錄修改配置文件,我的路徑是:E:\Qt\QtOnline\5.15.0\msvc2019\mkspecs\common\msvc-version.conf

在前面加一句QMAKE_MSC_VER = 1919(對應自己的編譯器版本):

開始我以爲沒構建成功,後來發現構建出來的東西莫名其妙跑到頂層目錄下了:

我們需要的就是plugins文件夾裏的dll。

1.可以手動把dll放到Qt安裝包目錄的sqldrivers裏:

2.(2020-06-11補充)也可以在構建時加上兩個 make 步驟,讓他自己安裝到目錄下(debug-install和release-install):

爲了調試方便,我把MYSQL目錄下的libmysql.dll也放到Qt安裝目錄的bin文件夾下:

拷貝完這兩個就可以開始測試了。

參照博客:https://www.cnblogs.com/szitcast/p/11105899.html

第三步,測試

新建Qt工程,pro里加上sql模塊:

QT += sql

然後隨便加幾句測試代碼:

#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>

void test_mysql()
{
    qDebug()<<QSqlDatabase::drivers();

    QSqlDatabase db=QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("localhost");
    db.setPort(3306);
    db.setUserName("root");
    db.setPassword("qq654344883");
    db.setDatabaseName("mysql_db");
    if(db.open()){
        QSqlQuery query;
        if(query.exec(R"(show global variables like "%datadir%";)")){
            if(query.next()){
                qDebug()<<query.value(0).toString()<<query.value(1).toString();
            }
        }else{
            qDebug()<<query.lastError();
        }
        db.close();
    }else{
        qDebug()<<db.lastError();
    }
}

第一次運行可能會出錯,lastError()顯示(QSqlError("2059", "QMYSQL: Unable to connect", "Authentication plugin 'caching_sha2_password' cannot be loaded"))。經查是MYSQL8.0改變了加密規則,MYSQL8.0之前的版本中加密規則是mysql_native_password,而在MYSQL8.0之後,加密規則是caching_sha2_password。

這裏我選擇把用戶登陸密碼規則設置爲mysql_native_password。

打開MYSQL的命令行工具(MySql 8.0 Command Line Client),執行:

use mysql;
alter user 'root'@'localhost' identified with mysql_native_password by '密碼';

再次運行我們的測試代碼:

大功告成!!!

參考博客:https://msd.misuland.com/pd/3255818100674662202

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章