Qt默认不带MySQL驱动,QSqlDatabase::addDatabase("QMYSQL")失败因qsqlmysql.dll未置于plugins/sqldrivers目录、缺少libmysql.dll依赖或版本/位数/编译器不匹配,需验证QSqlDatabase::drivers()含"QMYSQL"方可继续。

Qt 默认不带 MySQL 驱动,QSqlDatabase::addDatabase("QMYSQL") 会直接失败,报错 QSqlDatabase: QMYSQL driver not loaded —— 这不是你代码写错了,是插件根本没放对位置、或依赖库缺失。
QMYSQL 驱动文件放哪?路径必须严格匹配
Qt 的驱动加载靠插件机制,不是靠 .pro 里加 QT += sql 就能自动出来。关键三要素缺一不可:
-
qsqlmysql.dll(Windows)或libqsqlmysql.so(Linux)必须放在plugins/sqldrivers/目录下,且该目录必须在 Qt 运行时能搜到(通常是 Qt 安装目录下的plugins子目录,不是你项目目录) - 对应的 MySQL 客户端库(
libmysql.dll或libmysqlclient.so)得让系统能找到:Windows 下推荐直接丢进你的可执行文件(.exe)同级目录;Linux 下确保LD_LIBRARY_PATH包含其路径 - 驱动文件和 Qt 版本、编译器、位数(32/64)、ABI(如 MSVC vs MinGW)必须完全一致。用 Qt 6.5.3 + MSVC2019 编译的程序,不能用 Qt 6.4 + MinGW 编译的
qsqlmysql.dll
验证驱动是否就位:别等运行时才报错
在连接数据库前,先确认驱动已识别。加这段代码跑一下:
#include <QDebug> #include <QSqlDatabase> qDebug() << "Available drivers:" << QSqlDatabase::drivers();
输出里必须有 "QMYSQL"。如果没有,说明插件没加载成功——此时再检查路径、依赖、版本,比在 db.open() 返回 false 后瞎猜快得多。
MySQL 8.0+ 默认认证方式会导致连接被拒
MySQL 8.0 默认用 caching_sha2_password 插件认证,而 Qt 自带的 MySQL 驱动(基于较老 libmysql)不支持。现象是 db.open() 失败,db.lastError().text() 显示类似 Authentication plugin 'caching_sha2_password' cannot be loaded。
解决办法只有两个,选其一:
- 改用户认证方式(推荐开发环境用):
登录 MySQL 执行:ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; FLUSH PRIVILEGES; - 升级驱动(生产环境更稳妥):用 MySQL 官方提供的新版 Connector/C,并自己重新编译
qsqlmysql插件(需 Qt 源码或qtbase模块)
QODBC 是备选方案,但别当成“万能解药”
用 QODBC 绕过原生驱动问题确实可行,但代价明显:
- 必须额外安装 MySQL ODBC 驱动(如 MySQL Connector/ODBC 8.0),且 ANSI/Unicode 版本要和 Qt 编译方式匹配(MSVC 一般选 Unicode)
-
setDatabaseName()填的是你在 ODBC 数据源管理器里配的Data Source Name(DSN),不是数据库名;填错就直接open()失败,错误信息还很模糊 - 性能略低,部分高级 SQL 功能(如预处理语句绑定)行为可能和原生驱动不一致
它只是兜底手段,不是替代方案。真正稳定可控的路径,还是把 QMYSQL 插件配齐。
最容易被忽略的一点:Qt Creator 调试时运行的是它自己的 Qt 环境(比如 Kit 里指定的 Qt 版本),而你手动双击生成的 .exe 运行时走的是系统 PATH 或当前目录下的 Qt 动态库 —— 两者插件路径可能完全不同。务必在最终打包或部署前,用实际运行方式验证驱动加载状态。


















