ThinkPHP 6.1+ 连接 MySQL 报错因驱动名由 mysql 改为 pdo_mysql、连接器类路径由 think\db\connector\Mysql 变更为 PdoMysql、DSN 字段名严格化、MySQL 8.0 认证插件不兼容所致,需同步更新配置、扩展和认证方式。

ThinkPHP 6.1+ 连接 MySQL 报 Driver [mysql] not supported
升级到 ThinkPHP 6.1 或更高版本后,mysql 驱动名已被废弃,直接写 'type' => 'mysql' 会触发该错误。核心原因是底层驱动注册机制变了,不再自动映射旧名。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 把数据库配置中的
'type' => 'mysql'改成'type' => 'pdo_mysql' - 确认已安装
pdo_mysql扩展(运行php -m | grep pdo_mysql验证) - 若用的是 MySQL 8+,需额外检查
charset是否设为utf8mb4,否则可能连上但插入 emoji 失败
TP6 升级后 think\db\Connection 报 Class 'think\db\connector\Mysql' not found
这是典型的类路径残留问题:旧版代码或第三方扩展里还硬编码了已移除的连接器类路径。TP6.0 起,MySQL 连接器类已从 think\db\connector\Mysql 移至 think\db\connector\PdoMysql。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 全局搜索项目中所有
use think\db\connector\Mysql,替换为use think\db\connector\PdoMysql - 检查自定义数据库封装类,若重写了
connect()方法,需同步更新实例化逻辑,例如:new PdoMysql()而非new Mysql() - 第三方包如
topthink/think-orm若未升到 v3.0+,也会引发此错,必须统一升级
TP6.3 使用 Db::connect() 动态切换数据库时连接失败
动态连接在新版中对 DSN 构造更严格,漏掉 host、port 或拼错参数名会导致静默失败或抛出模糊异常。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 务必显式传入完整 DSN 数组,不要依赖默认值,例如:
Db::connect(['type' => 'pdo_mysql', 'hostname' => '127.0.0.1', 'database' => 'test', 'username' => 'root', 'password' => '']) -
hostname不能写成host,database不能写成dbname—— TP6 只认固定字段名 - 若连接远程 MySQL,注意防火墙和 MySQL 的
bind-address配置,本地测试通 ≠ 远程可连
MySQL 8.0+ 认证插件导致 TP6 连接被拒绝
MySQL 8.0 默认使用 caching_sha2_password 插件,而 PHP 的 PDO MySQL 扩展旧版本不支持,报错类似 Authentication plugin 'caching_sha2_password' cannot be loaded。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 临时方案:登录 MySQL,执行
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_pass'; - 长期方案:升级 PHP 到 7.4+ 并确保
pdo_mysql编译时启用了--with-mysqlnd(可通过php -i | grep "mysqlnd"确认) - TP6 配置中加
'options' => [\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION],让错误暴露得更早、更准
驱动兼容不是配对就完事,关键是每个环节的命名、扩展、协议都得对齐。少一个 _,少一个扩展,或者错一个认证方式,连接就断在看不见的地方。


















