mysql 8.0 连接 thinkphp 8.0 失败主因是 caching_sha2_password 认证插件不兼容、localhost 走 socket 导致 tcp 连接静默失败、pdo 客户端版本低于 8.0,须执行 alter user 切回 mysql_native_password、hostname 改为 127.0.0.1、charset 设为 utf8mb4 并显式禁用 ssl。

ThinkPHP8.0 连 MySQL 不是改个 database.php 就能通的,尤其连 MySQL 8.0+ 时,90% 的连接失败都卡在认证插件、SSL 或客户端库版本上,不是配置写错了,是底层握手直接被拒。
ALTER USER 必须执行,不是可选项
MySQL 8.0 默认用 caching_sha2_password 插件,而 PHP 7.4 以下或多数宝塔/AMH 环境里的 pdo_mysql 扩展根本不认识它——连接时抛出 Authentication plugin 'caching_sha2_password' cannot be loaded,不是 ThinkPHP 的错。
- 登录 MySQL(用 root):
mysql -u root -p - 查当前用户插件:
SELECT user, host, plugin FROM mysql.user WHERE user = 'your_user'; - 强制切回兼容模式:
ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';(注意替换%为实际 host,如localhost) - 立即生效:
FLUSH PRIVILEGES;
不执行这步,后面所有配置都是白搭。
database.php 里 hostname 别写 localhost
localhost 在 Linux/macOS 下会走 Unix socket,而 ThinkPHP 默认走 TCP;一旦 MySQL 配置了 skip-networking = ON 或没监听 127.0.0.1,就静默失败。
- 统一改成
'hostname' => '127.0.0.1'(本地开发)或具体 IP(远程) - Docker 环境必须写容器名(如
mysql)或host.docker.internal,不能写127.0.0.1 - Mac M1 用 Homebrew 装的 MySQL,默认只监听 socket,需确认
mysqld启用了bind-address = 127.0.0.1且skip-networking = OFF
charset 和 SSL 参数必须显式设
MySQL 8.0 默认字符集是 utf8mb4_0900_ai_ci,ThinkPHP 若配 charset => 'utf8' 会触发警告甚至插入乱码;云厂商 RDS 常强制 SSL,但 ThinkPHP 不透出具体错误,只报连接超时或空异常。
-
charset必须设为'utf8mb4',不是utf8 - 在
params数组里关 SSL:\PDO::MYSQL_ATTR_SSL_CA => null、\PDO::MYSQL_ATTR_SSL_CERT => null、\PDO::MYSQL_ATTR_SSL_KEY => null - 部分 PDO 版本支持
'sslmode' => 'disabled',但不如上面三个 null 值兼容性强
验证 pdo_mysql 底层是否真支持 MySQL 8.0
光看 PHP 版本没用。很多 CentOS 7、宝塔默认装的 php-pdo 包依赖的是 mysql-community-client-5.7,Client API version 是 5.7.x,它压根解析不了 caching_sha2_password 握手包。
- 终端执行:
php -i | grep -A5 pdo_mysql - 看输出里
Client API version是否 ≥8.0.0 - 如果不是,重装
php-mysqlnd(推荐)或升级整个 PHP,别硬调认证插件
这个检查点最容易被跳过——你改了用户插件、配对了 charset、关了 SSL,结果还是连不上,大概率就是这里卡住了。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











