thinkphp 5.1.41 无法连接 mysql 8 是因认证插件与驱动不兼容,须三步解决:1. 将 mysql 用户认证方式改为 mysql_native_password;2. 配置 database.php 中 type 为 pdo_mysql 且 hostname 用 127.0.0.1;3. 确保启用 pdo_mysql 扩展并禁用过时的 mysql 函数调用。

ThinkPHP 5.1.41 本身不支持 MySQL 8,不是配置问题,而是底层驱动和认证机制存在硬性冲突。你装完就报错(如 Access denied、Authentication plugin 'caching_sha2_password' cannot be loaded),根本原因不在 TP,而在 MySQL 8 的默认安全策略与 PHP 旧驱动的兼容断层。
必须做三件事,缺一不可:
-
改 MySQL 用户认证方式
MySQL 8 默认用caching_sha2_password插件,而 PHP 7.4 及以下(TP5.1 官方支持的最高 PHP 版本)只认mysql_native_password。
进 MySQL 命令行执行: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。 -
改 database.php 驱动类型为
pdo_mysql
TP5.1.41 的config/database.php中,不能写'type' => 'mysql'或'type' => 'mysqlnd'(后者在 PHP 8.2 已彻底移除,且 TP5.1 也不识别)。
必须明确写:'type' => 'pdo_mysql', 'hostname' => '127.0.0.1', // 注意:别写 localhost 'hostport' => 3306, 'database' => 'your_db_name', 'username' => 'root', 'password' => 'your_password', 'charset' => 'utf8mb4', 'prefix' => '',
*确保 PHP 启用了 pdomysql 扩展,且禁用已废弃的 mysql 扩展**
运行php -m | grep pdo_mysql,有输出才表示启用成功。
如果看到mysql或mysqli单独列出,没关系;但若项目里还调用了mysql_connect()这类函数(常见于老插件或自定义封装),TP5.1.41 在 PHP 7.4 下虽能运行,但一旦升级到 PHP 8.x 就直接 Fatal Error —— 所以建议现在就全局搜索grep -r "mysql_" app/ extend/,全部替换为\think\Db::query()或 PDO 原生写法。
不复杂,但容易忽略。做完这三项,再用一个最简脚本验证 MySQL 是否真通:
<?php $pdo = new PDO('mysql:host=127.0.0.1;port=3306;dbname=your_db_name;charset=utf8mb4', 'root', 'your_password');
var_dump($pdo->query("SELECT VERSION()")->fetch());
输出版本号,才算真正打通。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











