QT连接MySQL遇到的坑

QT 连接 MySQL 的坑不少,记录自己的踩坑经历以备后查。

驱动文件

驱动是指 QSqlDatabase::drivers() 输出的列表项,以下是输出项与对应驱动文件所在位置:

Qt/Qt5.12.10/5.12.10/mingw73_64/plugins/sqldrivers/*.dll

这里的5.12.10是我安装的 QT 版本,mingw73 是我安装的 mingw 版本,64是采用64位编译,每个人的配置会有所不同,可根据给出的模式检查对应 QT 目录是否存在以下两个dll:

qsqlmysql.dll
qsqlmysqld.dll

如果缺少,那么 QSqlDatabase::drivers() 输出项将不会出现 ‘QMYSQL’ ,这是造成无法连接的原因之一,这时候我们就需要自己编译这两个文件,如何编译后面再说。

客户端动态库

如果驱动文件存在,但是无法连接 MySQL ,那就是缺少 MySQL 的客户端动态库,找到 MySQL 的安装目录所对应的 libmysql.dll 文件:

mysql-8.0.21-winx64/lib/libmysql.dll

这里的8.0.21是我的 MySQL 版本,winx64是64位环境,可与之对照,将 libmysql.dll 复制到:

Qt/Qt5.12.10/5.12.10/mingw73_64/bin/

目录下,注意一点,x86的客户端动态库要放在对应的x86目录,x64的客户端动态库要放在对应的x64目录,别放错了。

重新编译执行对应版本的 QT 程序,如果能成功连接 MySQL ,那么问题解决,如果不行,说明 驱动文件客户端动态库 版本不兼容,需要自己重新编译驱动文件(这里的原因多半是 MySQL 的客户端动态库是8.x.xx版本而QT中的驱动文件是针对 MySQL 的5.x.xx版本编译的)。如果不想亲自编译驱动文件,也有快速解决方法,就是下载低版本的 MySQL,从中找出 libmysql.dll 替换。需要说明一点, MySQL 客户端动态库需要与 QT 中的x86/x64对应,但是无须跟安装的 MySQL 服务端对应,换言之,x86的客户端动态库是可以连接x64的 MySQL 服务端的。

编译驱动

这里是坑最多的地方,QT 有些版本是自带 MySQL 驱动文件的,但有些版本却又不带,原因可能是 MySQL 版本更新导致客户端动态库变化, QT 预制的编译好的版本太老无法兼容新的 MySQL 版本,所以干脆把这件事留给工程师自己做。

找到如下工程:

Qt/Qt5.12.10/5.12.10/Src/qtbase/src/plugins/sqldrivers/mysql/mysql.pro

启动 Qt Creator,将 mysql.pro 中的这行语句注释:

1
# QMAKE_USE += mysql

加入两行新语句,注意一点,以下的 C:/mysql-8.0.16-winx64/ 是我机器的 MySQL 安装路径,需要换成你自己的,另外,如果路径中含有空格,需要将路径首尾加上双引号:

1
2
INCLUDEPATH += C:/mysql-8.0.16-winx64/include/
LIBS += C:mysql-8.0.16-winx64/lib/libmysql.lib

有人说要再加上 DESTDIR 去指定编译的驱动文件生成位置,这个我测试没有效果,不加的话会自动生成到QT安装目录的磁盘根目录下,比如我的 QT 安装在C盘,那么就是生成在:

C:/plugins/sqldrivers/

在QT中只需要执行 编译 操作而不需要执行 编译运行 操作,因为它编译的是dll,不是可执行文件,如果 编译运行 将出现找不到执行文件的错误提示。

编译过程中可能出现找不到 qtsqldrivers-config.pri 的错误提示,这时候可以找一找

Qt/Qt5.12.10/5.12.10/Src/qtbase/src/plugins/sqldrivers/qsqldriverbase.pri

所在的同级目录是否有一个 configure.pri文件存在,如果存在,则打开 qsqldriverbase.pri 作以下修改:

1
2
# include($$shadowed($$PWD)/qtsqldrivers-config.pri)
include(./configure.pri)

也就是注释第一句,添加第二句。操作成功会在目录

C:/plugins/sqldrivers/

生成以下两个dll

qsqlmysql.dll
qsqlmysqld.dll

将之拷贝到以下目录即可:

Qt/Qt5.12.10/5.12.10/mingw73_64/plugins/sqldrivers/