TP5数据库配置没有想象中复杂,核心动作就是找到 database.php、把 MySQL 连接参数填对、再根据本地或线上环境切换。
thinkphp5数据库配置文件在哪?先找到那个数组
TP5 的数据库配置藏得很浅,多数情况下就在项目根目录附近。
ThinkPHP 5.0 默认路径是:
application/database.php
如果你用的是 ThinkPHP 5.1,配置文件会移动到:
config/database.php
打开这个文件,里面是一个 PHP 数组,这个数组在框架启动时会被加载,所有数据库连接都从这里读取参数。改动配置前建议先备份原文件,改错一个逗号就可能让整个应用报错。
常见的配置项如下:
return [
'type' => 'mysql',
'hostname' => '127.0.0.1',
'database' => 'your_db',
'username' => 'root',
'password' => '123456',
'hostport' => '3306',
'charset' => 'utf8',
'prefix' => 'tp_',
'debug' => true,
'deploy' => 0,
'rw_separate' => false,
];
type填数据库类型,TP5 支持 mysql、pgsql、sqlite、sqlsrv。hostname填数据库主机地址,本地一般用0.0.1。database填实际库名,不是用户名。prefix是表前缀,如果数据表叫tp_user,这里填tp_。debug开启后会输出 SQL 语句,开发环境可以开,生产环境建议关掉。
根据 ThinkPHP 官方文档说明,这些配置项都有默认值,缺省时框架会按默认规则处理,但生产环境不要依赖默认值,显式填清楚更稳妥。
tp5连接mysql数据库配置的本地开发场景实操
本地开发最常见的就是用 phpStudy、宝塔或 XAMPP 搭好 MySQL,然后在 TP5 里连上。
假设本地 MySQL 账号是 root,密码是 root,数据库名是

tp5_demo,配置可以写成:
return [
'type' => 'mysql',
'hostname' => '127.0.0.1',
'database' => 'tp5_demo',
'username' => 'root',
'password' => 'root',
'hostport' => '3306',
'charset' => 'utf8',
'prefix' => '',
];
保存后,在任意控制器里写一段测试代码:
use think\Db;
class Index
{
public function testDb()
{
$version = Db::query('select version() as v');
dump($version);
}
}
访问对应路由,如果能打印出版本号,说明连接成功。
如果出现 could not find driver,多半是 PHP 没装 pdo_mysql 扩展,Windows 下执行 php -m | findstr pdo_mysql,Linux 下执行 php -m | grep pdo_mysql 可以快速检查。
本地开发环境使用免费版 MySQL 或 MariaDB 即可,TP5 本身开源免费,数据库配置这一环节不会产生框架授权费用,云数据库的费用取决于服务商和规格,跟框架无关。
tp5与tp6数据库配置对比:别套用旧习惯
很多开发者从 TP5 升级到 TP6 时,会下意识去 application 目录找配置文件,结果扑空。
两者最明显的差异在配置位置和方式上。
| 对比项 | TP5 | TP6 |
|---|---|---|
| 配置文件位置 | application/database.php 或 config/database.php | config/database.php + 根目录 .env |
| 环境变量 | 支持但不强制 | .env 为主 |
| 配置返回 | PHP 数组 | PHP 数组结合 env 解析 |
| 查询方式 | think\Db 静态调用 |
think\facade\Db |
| 多库切换 | Db::connect() |
Db::connect() |
TP5 的配置基本就是一个数组写到底,TP6 把敏感信息拆到 .env 文件里,config/database.php 只负责读取环境变量。
如果你还在用 TP5,不需要照搬 TP6 的

.env 写法,把参数直接写进数组反而更好排查。
tp5数据库配置多个数据库与读写分离怎么做
多数据库连接用 Db::connect
有些场景要同时连两个库,比如一个业务库、一个日志库。
TP5 不用改全局配置,直接在代码里这样做:
use think\Db;
$logDb = Db::connect([
'type' => 'mysql',
'hostname' => '127.0.0.1',
'database' => 'log_db',
'username' => 'root',
'password' => 'root',
'hostport' => '3306',
'charset' => 'utf8',
]);
$list = $logDb->name('operation_log')->select();
Db::connect() 会返回一个独立的连接对象,不干扰默认数据库连接。
连接参数可以抽成数组,放在公共配置里,需要时再传给 connect()。
读写分离配置只需三步
TP5 官方支持读写分离,适合读多写少的应用。
第一步,找到 database.php,把 deploy 改为 1,rw_separate 改为 true。
第二步,把 hostname、username、password 改成数组,第一项是主库,后面是从库。
第三步,设置 master_num 为主库数量,通常填 1。
示例:
'deploy' => 1, 'rw_separate' => true, 'master_num' => 1, 'hostname' => ['192.168.1.11', '192.168.1.12'], 'username' => ['app_write', 'app_read'], 'password' => ['write_pwd', 'read_pwd'], 'hostport' => ['3306', '3306'], 'database' => 'main_db',
实测时先确保主库和从库都能单独连接,主从同步延迟较大的场景,写后立即读可能拿到旧数据,这时要强制走主库。
tp5数据库配置的常见坑:从utf8到权限排查
tp5数据库配置utf8还是utf8mb4?
默认配置里的 utf8 已经能处理中文,但不支持 emoji 表情。

如果应用涉及用户昵称、聊天内容、微信授权资料,行业共识认为 utf8mb4 更稳妥。
改法很简单:
'charset' => 'utf8mb4',
同时确认 MySQL 版本在 5.5.3 以上,并且数据表也使用 utf8mb4 字符集,表还是 utf8 时,单改框架配置不会解决乱码。
修改后不生效的排查顺序
改完 database.php 没有反应,按下面顺序排查:
- 检查是否改错文件:5.0 和 5.1 路径不同。
- 清空
runtime目录下的临时缓存。 - 检查控制器是否用了
Db::connect()写死旧参数。 - 确认 PHP 进程是否重启,CLI 模式下尤其明显。
- 看 MySQL 服务是否正常运行,本地可执行
mysql -uroot -p测试。
线上服务器还要检查安全组是否放行 3306 端口,国内云服务器经常会因为安全组默认不开放,导致外网连不上 MySQL。
TP5 数据库配置的核心始终是那几句话:找对文件、填对参数、分清环境。
把 database.php 当成数据库沟通的入口,保持配置简洁、可验证,就能避开大多数连接问题。
tp5数据库配置常见问题问答
tp5数据库配置修改后为什么没有生效?
先确认修改的文件路径是否正确,TP5.0 是 application/database.php,TP5.1 是 config/database.php,再看代码中是否用 Db::connect() 单独指定了参数,单独连接会覆盖全局配置,最后清空 runtime 目录下的缓存再访问一次。
tp5数据库配置多个数据库怎么切换?
用 Db::connect($config) 方法创建独立连接,$config 是包含 type、hostname、database、username、password 等字段的数组,创建后返回的连接对象不改变全局默认数据库,用完即可丢弃。
tp5数据库配置的hostname用localhost还是127.0.0.1?
多数情况下两者都能连通。localhost 可能优先走本地 socket,0.0.1 明确走 TCP/IP,线上环境填内网 IP 或云数据库地址,本地开发填 0.0.1 可以减少解析歧义。
