基于项目需求,现需要在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。

MySQL Qt连接远程 qt远程连接数据库_SSL

3. 编译源码

3.1 修改.pro文件

MySQL Qt连接远程 qt远程连接数据库_SSL_02

 

 

注释掉 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下编译成功得到结果文件

MySQL Qt连接远程 qt远程连接数据库_Qt_03

 

 

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