报错本质是mysql 8.0默认caching_sha2_password认证插件与php≤7.3或集成环境不兼容,需执行alter user 'root'@'host' identified with mysql_native_password by 'pwd'并flush privileges,且thinkphp中hostname须设为127.0.0.1而非localhost。

ThinkPHP项目一升级MySQL到8.0就报错“SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client”,不是密码错了,也不是配置写漏了,而是MySQL 8.0默认用caching_sha2_password认证,而你当前PHP环境(尤其是phpEnv、XAMPP或PHP ≤7.3)压根不认它——连接在TCP握手阶段就断了。
确认是不是认证插件导致的
别猜,进 MySQL 命令行执行这句,看实际生效的插件:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
重点看plugin列。如果是caching_sha2_password,且你用的是 PHP 7.2/7.3 或 phpEnv、XAMPP 等集成环境,默认就是它拦路。注意:'root'@'localhost'和'root'@'%'是两个独立用户,得分别查、分别改。
ALTER USER 改认证方式(最稳、不用重启 MySQL)
对目标用户执行一条 SQL 即可,兼容所有托管云数据库(如阿里云 RDS):
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';
执行FLUSH PRIVILEGES;
⚠️ 如果报ERROR 1396 (HY000),说明该user@host组合根本不存在,先用CREATE USER补上再改。
ThinkPHP 配置里必须写 127.0.0.1,别写 localhost
Windows 下 localhost 可能走命名管道或 IPv6 回环,触发超时或二次报错 SQLSTATE[HY000] [2054]。
在 config/database.php 中确保这几项明确:
第一步:'hostname' => '127.0.0.1'(不是 localhost)
第二步:'hostport' => 3306(显式写数字,别留空或字符串)
第三步:'username' => 'root'(对应你刚改过插件的那个用户)
第四步:'password' => 'your_password'(密码要和 ALTER USER 里一致)
第五步:'database' => 'test_db'(库名必须已存在,否则会报 Unknown database)
第六步:'db_type' => 'mysql'(别漏,TP8 不自动推导)
先绕开框架,用原生 mysqli 验证通不通
写个最小验证脚本 test_db.php,浏览器直访:
<?php <br>$conn = new mysqli("127.0.0.1", "root", "your_password", "test_db", 3306);<br>if ($conn->connect_error) {<br> die("Connection failed: " . $conn->connect_error);<br>}<br>echo "Connected successfully";<br>?>
这一步操作起来很简单,直接把文件拖进去就行。如果这里都连不上,ThinkPHP 肯定也连不上。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











