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 | INCLUDEPATH += C:/mysql-8.0.16-winx64/include/ |
有人说要再加上 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 | # include($$shadowed($$PWD)/qtsqldrivers-config.pri) |
也就是注释第一句,添加第二句。操作成功会在目录
C:/plugins/sqldrivers/
生成以下两个dll
qsqlmysql.dll
qsqlmysqld.dll
将之拷贝到以下目录即可:
Qt/Qt5.12.10/5.12.10/mingw73_64/plugins/sqldrivers/