菜鸟-创作你的创作

​PHP8.1与MySQL 8.0权限认证问题解决方案

下面给你一篇实战导向 + 可直接解决问题的完整技术文章,适合做博客、技术文档或排错手册。


PHP 8.1 与 MySQL 8.0 权限认证问题解决方案(全流程详解)


一、问题背景:为什么 PHP 8.1 连不上 MySQL 8.0?

在使用 PHP 8.1 + MySQL 8.0 的组合时,很多人会遇到类似报错👇

SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client

或:

Authentication plugin 'caching_sha2_password' is not supported

📌 核心原因一句话:

MySQL 8.0 默认认证方式变了,而 PHP 的 MySQL 客户端(mysqlnd)不完全兼容


二、问题根源解析(必须搞懂)

1️⃣ MySQL 8.0 默认认证方式变化

MySQL 8.0 开始:

版本默认认证插件
MySQL 5.7mysql_native_password
MySQL 8.0caching_sha2_password

而很多 PHP 环境:

👉 导致 PHP 无法识别 MySQL 8.0 的认证方式


2️⃣ PHP 8.1 本身没问题,问题在扩展

重点说明👇
不是 PHP 8.1 不支持 MySQL 8.0
✅ 是 MySQL 认证插件 与 PHP MySQL 扩展不匹配


三、最常见的报错场景汇总

报错信息原因
authentication method unknown认证插件不支持
Access denied for user用户权限或 host 错误
SQLSTATE[HY000] [2054]mysqlnd 不兼容
Can’t connect to MySQL server端口/防火墙

四、解决方案一(最推荐):修改 MySQL 用户认证方式 ⭐⭐⭐⭐⭐

✅ 思路

把 MySQL 8.0 用户的认证方式改回 mysql_native_password


1️⃣ 登录 MySQL

mysql -u root -p


2️⃣ 查看当前用户认证方式

SELECT user, host, plugin 
FROM mysql.user;

你会看到类似:

user   | host | plugin
-------+------+-----------------------
test   | %    | caching_sha2_password


3️⃣ 修改用户认证插件(关键步骤)

ALTER USER 'test'@'%' 
IDENTIFIED WITH mysql_native_password 
BY '你的密码';


4️⃣ 刷新权限

FLUSH PRIVILEGES;

90% 的 PHP + MySQL 8.0 连接问题到此结束


五、解决方案二:创建兼容用户(推荐生产环境)

不动原有账号,单独给 PHP 用一个用户 👇

CREATE USER 'phpuser'@'%' 
IDENTIFIED WITH mysql_native_password 
BY 'strong_password';

GRANT ALL PRIVILEGES ON your_db.* TO 'phpuser'@'%';

FLUSH PRIVILEGES;

📌 优点


六、解决方案三:升级 PHP MySQL 驱动(进阶)

如果你不想改 MySQL 认证方式:

1️⃣ 确认 mysqlnd 版本

php -i | grep mysqlnd

建议版本:

mysqlnd 8.1.x


2️⃣ 确认 PHP 编译支持

php -m | grep mysqli
php -m | grep pdo_mysql


3️⃣ Docker / 源码编译用户注意

如果你用的是:

需要确保:

--with-mysqli=mysqlnd
--with-pdo-mysql=mysqlnd

📌 但现实中,仍不如方案一稳定


七、PHP 代码连接示例(PDO & mysqli)

1️⃣ PDO 示例(推荐)

$dsn = "mysql:host=127.0.0.1;dbname=test;charset=utf8mb4";
$user = "phpuser";
$pass = "strong_password";

$pdo = new PDO(
    $dsn, 
    $user, 
    $pass, 
    [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
    ]
);


2️⃣ mysqli 示例

$conn = new mysqli(
    "127.0.0.1",
    "phpuser",
    "strong_password",
    "test"
);

if ($conn->connect_error) {
    die("连接失败: " . $conn->connect_error);
}


八、常被忽略的 3 个坑(高频)

❌ 1️⃣ host 不一致

'user'@'localhost'
'user'@'%'

PHP 远程连接时:


❌ 2️⃣ MySQL 8 强制 SSL

某些环境需要关闭:

ALTER USER 'phpuser'@'%' REQUIRE NONE;


❌ 3️⃣ 密码加密方式未更新

改插件但没改密码 ❌
必须 重新指定密码


九、生产环境推荐方案总结(直接照做)

👉 最佳实践组合

项目建议
MySQL8.0
PHP8.1
认证插件mysql_native_password
用户独立 PHP 用户
权限最小权限原则

十、一句话总结(面试 / 文档可用)

PHP 8.1 连接 MySQL 8.0 的权限问题,本质是认证插件不兼容,最稳定的解决方案是将 MySQL 用户认证方式切换为 mysql_native_password。

退出移动版