基於項目需求,現需要在Windows環境下使用Qt項目遠程連接Ubuntu下的MySQL數據庫。
一、
Qt在5.12版本后下載不再自帶QMYSQL 驅動,所以如果要使用QMYSQL驅動需要自己編譯。
1. 下載mysql-connector-c-6.1.11源碼
下載地址:https://downloads.mysql.com/archives/c-c/
下載對應位數版本的源碼,
注意,使用的Qt版本和數據庫MySQL的版本位數必須相同,既要么都是32位,要么都是64位。
2. 打開官方提供文件sqldrivers.pro
文件所在路徑為D:\Qt\5.15.2\Src\qtbase\src\plugins\sqldrivers
D:\Qt是我的Qt的安裝目錄,如果沒有找到Src文件夾,則使用Qt的MaintenanceTool.exe在選擇組件時選中Source。
3. 編譯源碼
3.1 修改.pro文件
注釋掉 QMAKE_USE += mysql語句,不然會報錯找不到
添加庫文件路徑LIBS和 頭文件路徑(直接復制過來的路徑是 \ ,需要修改成 / )
指定編譯后的結果文件存放的地方 DESTDIR
3.2 修改qsqldriverbase.pri文件
該文件中有這么一句
include($$shadowed($$PWD)/qtsqldrivers-config.pri)
但是在Qt的文件夾中並不能找到該文件,會報錯。但是,我們可以在文件夾中找到configure.pri文件。所以,修改上面語句:
#include($$shadowed($$PWD)/qtsqldrivers-config.pri)
include (./configure.pri)
3.3 編譯程序
在Debug模式下編譯或Release模式。
(筆者在Debug下編譯成功但沒有結果文件,在Release下編譯成功得到結果文件
3.4 移動dll文件
將結果文件中的兩個DLL文件移動到你的Qt目錄下, D:\Qt\5.15.2\msvc2019_64\plugins\sqldrivers(筆者用的msvc)
3.5 移動mysql的庫文件
將mysql-connector-c-6.1.11的lib目錄下的libmysql.dll放到Qt的目錄bin下,(筆者是D:\Qt\5.15.2\msvc2019_64\bin)
3.5 在Qt中查看可用的SQL 驅動
qDebug() << QSqlDatabase::drivers();
4. 遠程連接MySQL數據庫
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); //選擇使用的QSql Driver db.setHostName("192.168.1.229"); //遠程連接的數據庫IP地址 db.setPort(3306); //數據庫提供的端口 db.setUserName("xxx"); //遠程連接的用戶 db.setPassword("xxx"); // 密碼 db.setDatabaseName("0voice"); //要訪問的數據庫 // db.setConnectOptions("SSL_KEY=client-key.pem;SSL_CERT=client-cert.pem;SSL_CA=ca-cert.pem;CLIENT_IGNORE_SPACE=1"); if(!db.open()) { qDebug() << db.lastError().text(); }else { qDebug() << "連接成功"; return ; }
需要在MySQL的數據庫中有可用於遠程訪問的用戶。
MySQL8.0版本默認的加密方式是caching_sha2_password。但是很多客戶端很難支持,筆者在數據庫配置中將密碼加密方式改為了mysql_native_password。
項目的.pro文件中需要添加 QT += sql
運行時若提示"driver not load",將libmysql.dll放到exe同級文件夾下。
5. SSL問題
ubuntu下的MySQL8.0默認開啟遠程連接SSL。
所以遠程連接需要處理SSL。
5.1 選擇關閉ssl
show variables like ‘%ssl%’;
查看數據庫的SSL設置情況,
在/etc/mysql/mysql.conf.d/目錄下,修改mysqld.cnf文件。
[mysqld]
skip_ssl #在這個位置添加這一行
重啟mysql服務
service mysql restart
mysql的SSL就關閉了。
5.2 提供SSL
。。。暫時沒找到辦法。。。我的Qt使用了setConnectOptions設置了證書也還是提示SSL連接錯誤
http://slproweb.com/products/Win32OpenSSL.html