thinkphp 6 数据库配置默认在 config/database.php,需确保 'database' 值正确且库已存在,修改后执行 php think clear 清缓存;mysql 8 认证错误需执行 alter user ... identified with mysql_native_password。

ThinkPHP 连接 MySQL 数据库的配置位置在哪
ThinkPHP 6 的数据库配置默认在 config/database.php,不是 .env(虽然 .env 也能配,但优先级和写法容易混淆)。直接改 database.php 最稳妥,尤其新手。
常见错误:在 .env 里写了 DB_HOST=127.0.0.1 却没开 APP_ENV=local 或没启用 think\facade\Config::loadEnv(),导致配置不生效。
-
'hostname' => '127.0.0.1'(不是DB_HOST) -
'database' => 'your_db_name'(库名必须已存在) -
'username' => 'root'、'password' => ''(注意空密码要写'',不能留空或注释掉) - 端口默认是
'hostport' => 3306,如果改过 MySQL 端口必须显式写上
tp6 Db::table() 查询报错 “No database selected” 怎么办
这个错误不是连接失败,而是连接成功后没指定用哪个库——说明配置里 'database' 为空、拼错、或该库在 MySQL 里根本不存在。
验证方法:用命令行登录 MySQL,执行 SHOW DATABASES; 看目标库是否在列表中;再检查 database.php 里的 'database' 值是否和它**完全一致**(区分大小写,尤其在 Linux 环境)。
立即学习“PHP免费学习笔记(深入)”;
- 别用中文库名或带空格/特殊符号的库名
- 如果用的是 Docker,确认 MySQL 容器内已创建该库(
docker exec -it mysql mysql -uroot -p -e "CREATE DATABASE IF NOT EXISTS your_db_name CHARACTER SET utf8mb4;") - 修改配置后必须清缓存:
php think clear,否则 TP 会读旧配置
Db 类和 Model 类连库行为有什么区别
Db::table('user') 是原生查询,不依赖模型文件,但所有表名、字段都要手写字符串;UserModel::find(1) 会自动关联 user 表(按命名规范),但前提是 UserModel 类存在且继承了 think\Model。
关键差异在连接初始化时机:Db 是首次调用时懒连接;Model 在实例化时就准备连接,如果模型里重写了 protected $connection,会覆盖全局配置。
- Db 查询不走模型事件(如
before_insert),适合简单 CRUD - Model 查询支持自动时间戳、类型转换、软删除,但要求表结构和模型属性对得上
- 跨库查询不能用 Model 默认方式,得用
Db::connect('other_config')->table('other_db.table')
连接 MySQL 8 报 “Client does not support authentication protocol”
这是 MySQL 8 默认用 caching_sha2_password 插件,而 ThinkPHP 6.0.x 自带的 PDO 驱动只认 mysql_native_password。不是 TP 版本问题,是认证协议不兼容。
解决方法只有两种,推荐第一种:
- 登录 MySQL 执行:
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_pass'; FLUSH PRIVILEGES; - 升级到 ThinkPHP 6.3+ 并确保 PHP 安装了
pdo_mysql且 MySQLi 扩展启用(仍需服务端降级插件才稳) - 不建议改 TP 源码硬切驱动,维护成本高
实际项目里,这个错误往往卡在部署阶段,本地开发用 MySQL 5.7 不会暴露——别等上线才查。











