ThinkPHP8连接MySQL需同时满足四项前提:MySQL服务运行、认证插件改为mysql_native_password、PHP启用pdo_mysql扩展、database.php中hostname必须用127.0.0.1而非localhost,缺一即报Access denied或Connection refused。

ThinkPHP8 能连上 MySQL 的前提,不是改完 database.php 就完事,而是 MySQL 服务本身在跑、认证方式兼容、PHP 扩展已启用、配置里没写错关键参数——漏掉任意一环,都会卡在「Access denied」或「Connection refused」。
MySQL 8.0 默认认证插件不兼容 PHP 旧驱动
MySQL 8.0+ 默认用 caching_sha2_password,而多数 PHP 环境(尤其 phpEnv 或低版本 PHP)只认 mysql_native_password。不改它,root@localhost 就永远被拒绝。
- 进 MySQL 命令行(
mysql -u root -p),执行:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '';
(密码为空就留空,有密码就填你设的) - 执行
FLUSH PRIVILEGES; - 确认改成功:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
结果里plugin列必须是mysql_native_password
ThinkPHP8 的 database.php 配置必须显式指定 127.0.0.1
别写 localhost——Windows 下它可能走命名管道或 IPv6 回环,导致连接超时或报错 SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client。
- 路径是
config/database.php(TP8.0+ 不再默认读.env,除非你手动加了 dotenv 支持) - 关键几项必须这样写:
'hostname' => '127.0.0.1',<br>'hostport' => 3306,<br>'username' => 'root',<br>'password' => '', // phpEnv 默认无密码,改过就填改后的<br>'database' => 'test_db', // 必须是已创建的库名,否则启动时报 Unknown database
-
db_type或type设为'mysql',别漏
先甩开框架,用原生 mysqli 验证底层通不通
别一上来就跑 php think migrate 或访问页面——框架报错信息常掩盖真实原因。最小闭环验证最省时间。
立即学习“PHP免费学习笔记(深入)”;
- 在网站根目录建
test_db.php,内容:<?php<br>$mysqli = new mysqli('127.0.0.1', 'root', '', 'test_db', 3306);<br>if ($mysqli->connect_error) {<br> die('Connect Error: ' . $mysqli->connect_error);<br>}<br>echo 'OK, MySQL is reachable';<br>$mysqli->close();<br>?> - 浏览器直接访问
http://your-site/test_db.php,输出OK, MySQL is reachable才算过关 - 如果失败,错误信息就是真实瓶颈:
Connection refused→ MySQL 没启动;Access denied→ 认证或密码错;Unknown database→ 库不存在
phpEnv 用户务必确认 MySQL 服务状态和端口占用
很多人改完配置死活连不上,其实 phpEnv 界面里 MySQL8 显示的是「未启动」或「启动中」——它根本没跑起来。
- 打开 phpEnv 主界面,看「服务状态」栏,MySQL8 必须是绿色「已启动」,不是灰色或黄色
- 若点「启动」失败,去日志里搜
Can't start service或Address already in use,大概率是 3306 被 Navicat、Docker、另一个 MySQL 实例占了 - 命令行验证是否真通:
mysql -u root -p回车后直接敲回车(空密码)或输你设的密码,能进 MySQL 提示符就说明服务层 OK
真正卡住人的地方,往往不是配置语法,而是 MySQL 认证方式、localhost 解析行为、服务实际运行状态这三者之一没对齐。每次连不上,先跑 test_db.php,再查 plugin,最后盯一眼 phpEnv 界面右下角的服务状态——比反复改配置快得多。



















