第零步,說明
從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 '密碼';
再次運行我們的測試代碼:
大功告成!!!