db::connect() 不是数据库连接入口,真正起作用的是配置;配置错误(如db_host写localhost、.env未生效、mysql 8认证插件不兼容等)会导致连接失败。

Db::connect() 不是你连上 MySQL 的入口,真正起作用的是配置 —— 配置错一个地方,后面所有查询都会卡在连接阶段。
DB_HOST 写成 localhost 就连不上
MySQL 在 Windows 和部分 Linux 环境下对 localhost 有特殊处理:它会尝试走命名管道或 Unix socket,而 phpEnv、Docker、甚至某些 Homebrew 安装的 MySQL 默认只监听 TCP/IP。
你看到的 SQLSTATE[HY000] [2002] Connection refused,90% 是这个原因。
- 必须写成
127.0.0.1(本地开发)或具体 IP(远程) - Docker 环境不能写
127.0.0.1,得用容器名(如mysql)或host.docker.internal - Mac M1 上用 Homebrew 装的 MySQL,需确认
my.cnf里有bind-address = 127.0.0.1且skip-networking = OFF
.env 优先级高于 config/database.php
ThinkPHP 6/8 启用 .env 后,整个数据库配置以它为准 —— 即使你只改了 DB_HOST,config/database.php 里的 connections.mysql.hostname 等字段也会被完全忽略。
-
.env文件必须放在项目根目录,文件名是.env(不是.env.example,也不能带 BOM) - 键名必须是 ThinkPHP 8 默认格式:
DB_TYPE、DB_HOST、DB_NAME、DB_USER、DB_PWD(不是DB_PASSWORD或DB_USERNAME) - 密码含
@、/、:等字符时,必须 URL 编码,例如pa@ss/word→pa%40ss%2Fword - 改完
.env没生效?清空runtime/cache/目录再试
MySQL 8.0 连不上,大概率是认证插件不兼容
MySQL 8.0 默认使用 caching_sha2_password 插件,但多数 PHP 环境(尤其 PHP 7.4 以下、宝塔、AMH、phpEnv 自带的 pdo_mysql)根本不支持它,报错是:Authentication plugin 'caching_sha2_password' cannot be loaded。
- 登录 MySQL 执行:
SELECT user, host, plugin FROM mysql.user WHERE user = 'your_user'; - 强制切回兼容模式:
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';(注意把%替换为实际 host) - 立即生效:
FLUSH PRIVILEGES; - 这步不做,后面所有配置都是白搭
多库场景下,Db::connect('xxx') 的参数不是数据库名
ThinkPHP 多库机制不识别“数据库名”或“模型名”,只认你在 config/database.php 的 connections 数组里定义的连接键名。
- 键名只能是小写字母 + 下划线,比如
mysql_read,不能是mysql.read或MysqlRead - 每个连接必须显式写
'type' => 'mysql',漏掉就会拿 MySQL 驱动去解析 PostgreSQL 配置,报Class 'PDO' not found -
Db::connect('mysql_read')返回的是全新Query实例,不改变全局默认连接;每次要用,都得显式调用一次 - 模型里设
protected $connection = 'mysql_read';只在类首次加载时读取一次,改配置不刷新,也不支持跨库 JOIN
MySQL 8.0 的字符集、SSL、PDO 版本兼容性这些细节,往往比语法错误更难排查——它们不报明确异常,只让连接静默失败或查询乱码。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











