thinkphp 默认不内置 greatdb 驱动,需手动注册:在 database.php 中添加 'connector' => ['greatdb' => \think\db\connector\mysql::class] 或通过 db::extend('greatdb', \think\db\connector\mysql::class) 注册;连接参数须严格匹配 mysql 5.7+ 行为,键名仅支持小写字母、数字、下划线,且每个 connection 子数组必须显式声明 'type' => 'greatdb'。

ThinkPHP 默认不内置 GreatDB(万里数据库)驱动,直接填 type => 'greatdb' 会报 Class 'think\db\connector\Greatdb' 找不到 —— 这不是配置写错了,是驱动压根没注册。
GreatDB 驱动必须手动注册才能用
GreatDB 是兼容 MySQL 协议的分布式数据库,底层用的是 MySQL PDO,但 ThinkPHP 不会自动把 greatdb 映射到 mysql 驱动。你得显式告诉框架:“这个 type 名字,走 mysql 的连接器”。
- 在
config/database.php顶层加一项:'connector' => ['greatdb' => \think\db\connector\Mysql::class] - 或者更稳妥的方式:在应用初始化时(如
app/common.php或服务提供者中)调用Db::extend('greatdb', \think\db\connector\Mysql::class) - 别漏掉
use think\facade\Db;和use think\db\connector\Mysql; - 验证是否生效:
var_dump(Db::connect(['type' => 'greatdb'])->getConnectType());应该输出mysql
连接参数必须严格匹配 MySQL 5.7+ 行为
GreatDB 虽兼容 MySQL 协议,但在 SSL、认证插件、默认字符集上常有差异。填错一个参数,连接就卡在 SQLSTATE[HY000] [2002] 或 [1045]。
-
hostname不能写localhost:GreatDB 服务端通常禁用 Unix socket,必须用127.0.0.1或真实 IP -
charset必须设为utf8mb4:GreatDB 6.x+ 默认要求,设utf8会触发握手失败 -
hostport显式写全,别依赖默认值:即使端口是 3306,也写上'hostport' => '3306',避免某些版本解析 DSN 时丢端口 - 若启用了 GreatDB 的强密码策略(如 SHA256),需在
params中加:PDO::MYSQL_ATTR_SSL_MODE => PDO::SSL_MODE_REQUIRED,且证书路径必须是绝对路径
多库切换时 connection 键名不能含点号或大写
金融级场景常见一主多从 + GreatDB 分片库组合。你定义 'greatdb_shard_01' 没问题,但写成 'greatdb.shard01' 或 'GreatDBShard',Db::connect('greatdb.shard01') 就直接抛 Connection not found。
- 键名只允许小写字母、数字、下划线;开头不能是数字;长度建议 ≤32 字符
- 每个 connection 子数组里
type必须写,哪怕都是greatdb—— 框架靠它决定走哪个 connector - 如果用
.env注入 host/port,记得在database.php里用env('GREATDB_HOST', '127.0.0.1'),别直接写死 - 测试连接前,先清缓存:
php think clear:config,否则改了配置也不生效
真正容易被忽略的是:GreatDB 的事务隔离级别默认是 READ-COMMITTED,而 ThinkPHP 的 transaction() 在嵌套调用时会尝试设 REPEATABLE-READ,导致 SQLSTATE[HY000]: General error: 1235。解决方法是在 connection 配置里加 'params' => [PDO::ATTR_EMULATE_PREPARES => true],或统一改应用层事务语义。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











