
最近要做的项目需要Qt连接MySQL数据库,刚开始接触,踩了不少坑,记录一下。
1.环境操作系统:Windows10
Qt:5.14.2
Qt Creator:4.11.1
MySQL:mysql-8.0.26-winx64
Navicat:12.0.29(64-bit)
在Qt中写一个简单的程序测试数据库连接:
(1)在.pro文件中添加QtSql模块支持:QT += sql
(2)main.cpp
#include "mainwindow.h" #include#include #include #include int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; //选择数据源 QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); //设置MySql服务器名称 db.setHostName("localhost"); //设置端口号 db.setPort(3306); //设置数据库名 db.setDatabaseName("test"); //设置用户名密码 db.setUserName("root"); db.setPassword("root"); bool ok = db.open(); if (ok){ qDebug() << QString("数据库打开成功"); } else{ qDebug() << "数据库打开失败:" << db.lastError(); } w.show(); return a.exec(); }
运行后发现了第一个坑报错:
通过搜查大佬们的博客得知,这是典型的驱动问题,主要和版本有关。在 5.12 及之前的版本中,Qt 的安装包中自带 MySql 驱动,在 plugins/sqldrivers 目录下可以找到。但是!5.13以后就没这个驱动了,很多资料都选择了手动编译。本着小白踩坑的心思,我先选择了手动编译(事实证明,坑太多了!)
此时遇到了第二个坑:Qt需要安装源码。注意勾选"Sources"组件,没有安装源码的,专家建议卸载重装。
后面就是在源码里面找到mysql,修改源码,qmake编译。做的时候没截图,给大家放一下大佬的链接仅供学习~
如果大家按照链接步骤顺利编译出来了驱动,恭喜你可以脱坑了。但是小白遇到了第三个坑:按照教程,应该将编译后的qsqlmysql.dll以及qsqlmysqld.dll文件拷贝到相应的目录。小白只编译出来了qsqlmysql.dll一个文件:
找了找原因,两个可能:1.我手残,可能在哪步出了问题自己没发现。2. 教程用的是msvc2017_64,我用的是mingw73_64。抱着侥幸的心思回Qt运行程序,同一个世界,同样的报错~ 还是少驱动,小白认命继续找别的方法。
偶然发现了一个方法:在https://downloads.mysql.com/archives/c-c/下载mysql-connector-c。下载解压后在lib目录中找到文件“libmysql.dll”,将其复制到Qt的bin目录下,重启Qt Creator打开工程并运行。
注意:libmysql.dll这个文件对应的mysql的位数必须与QT的位数相同
复制好后,回Qt运行程序,遇到了第四个坑:报错,Authentication plugin ‘caching_sha2_password’ cannot be loaded
查了一下资料,发现是MySQL版本问题。
MySQL8以前,加密规则是:mysql_native_password
MySQL8以后,加密规则是:caching_sha2_password
很显然现在的问题是加密规则对不上,小白选择修改MySQL的加密规则为mysql_native_password
(1)管理员打开cmd
(2)进入mysql安装目录的bin目录
(3)修改密码,一直没改初始密码,但确实有点繁琐,趁这个机会改成root
命令:mysqladmin -u用户名 -p旧密码 password 新密码
mysqladmin -uroot -pMQpTM.t=!7_z password root
(4)新密码登录
mysql -uroot -p
(5)修改加密规则(password就是数据库密码)
ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER;
(6)更改用户密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
(7)刷新权限
FLUSH PRIVILEGES;
(8)重置密码
alter user 'root'@'localhost' identified by 'root';
注意:不要修改了加密规则就不管后面的了!后面的更改用户密码、刷新权限和重置密码都非常重要!如果改完加密规则就退出的话,你会发现mysql登不上去了… 数据库初始化就变成了唯一的出路!
6.数据库连接成功大功告成~
第一次用Qt遇到了不少问题,网上关于这部分的教程杂七杂八的有很多,一个一个尝试也需要时间和耐心,研究了两天bug一个接着一个,每个都不一样就很绝望。好在最后成功了,也算对得起掉的头发哈哈~