PHP 7.4 与 MySQL 8.0 之间的权限认证问题通常是由于 MySQL 8.0 引入了新的默认身份验证插件 (caching_sha2_password) 和 PHP 7.4 使用的旧有 MySQL 客户端库(mysqlndmysqli)不兼容所导致的。

MySQL 8.0 默认使用 caching_sha2_password 身份验证插件,而 PHP 7.4 默认的 MySQL 客户端(如 mysqlnd)可能不支持此认证方法。为了避免身份验证问题,你可以采取以下解决方案。

解决方案 1:修改 MySQL 用户的认证插件

最直接的解决方法是将 MySQL 8.0 中的用户认证插件改回 mysql_native_password,它是兼容 PHP 7.4 的旧版认证方式。

步骤:

  1. 登录到 MySQL 服务器:
    mysql -u root -p
    
  2. 修改 MySQL 用户的认证插件,假设你使用的用户名是 your_user
    ALTER USER 'your_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';
    

    如果你在远程访问数据库,可以将 localhost 替换为 % 或相应的主机名:

    ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';
    
  3. 刷新权限:
    FLUSH PRIVILEGES;
    
  4. 退出 MySQL:
    exit;
    

解决方案 2:使用 MySQL 8.0 默认的 caching_sha2_password 插件

如果你不希望更改 MySQL 用户的认证插件,并且希望在 PHP 中支持 caching_sha2_password,你需要确保 PHP 使用的是支持此认证方式的 MySQL 客户端。

步骤:

  1. 更新 PHP 的 MySQL 客户端库
    确保你使用的 PHP 版本已经安装并启用了 mysqlnd 扩展,并且支持 MySQL 8.0 的 caching_sha2_password 插件。

    在某些情况下,PHP 7.4 默认的 mysqlnd 版本可能无法正确处理 MySQL 8.0 的新认证方式。你可以尝试升级 PHP 和 mysqlnd

    如果你使用的是 Ubuntu 或 Debian 系统,可以执行以下命令来升级相关包:

    sudo apt-get update
    sudo apt-get install php7.4-mysql
    sudo apt-get upgrade php7.4-mysql
    
  2. 检查 mysqlnd 是否启用
    在 PHP 中,确保 mysqlnd 扩展已启用。在 php.ini 文件中检查是否启用了 mysqlnd

    你可以通过以下命令检查是否安装了 mysqlnd

    php -m | grep mysqlnd
    
  3. 确认 PHP 支持 caching_sha2_password
    如果 PHP 7.4 的 mysqlnd 扩展版本较低,可以考虑升级到支持 caching_sha2_password 插件的版本(PHP 7.4 及更高版本的 mysqlnd 通常已经支持)。

解决方案 3:更新 PHP 和 MySQL 配置

有时候,PHP 和 MySQL 之间的权限认证问题可能与配置文件中的设置有关。如果你使用的是 Apache 或 Nginx 等 Web 服务器,确保以下设置已正确配置。

  1. 在 MySQL 配置文件中启用 mysql_native_password 插件
    如果你不想更改每个用户的身份验证插件,可以在 MySQL 配置文件中启用 mysql_native_password 插件:

    编辑 /etc/my.cnf/etc/mysql/my.cnf 文件,添加以下行:

    [mysqld]
    default_authentication_plugin=mysql_native_password
    

    然后重新启动 MySQL 服务:

    sudo systemctl restart mysql
    
  2. 确保 MySQL 服务版本和客户端兼容
    确保 PHP 7.4 使用的 MySQL 客户端与 MySQL 8.0 兼容。如果 PHP 使用的 MySQL 客户端版本过旧,也会导致认证问题。

解决方案 4:检查 PHP 配置和 MySQL 连接代码

确保 PHP 代码中使用正确的 MySQL 连接方式,并且相关的连接设置已正确配置。

例如,在 PHP 中使用 mysqli 扩展时,确保使用正确的主机名、用户名和密码:

$mysqli = new mysqli('localhost', 'your_user', 'your_password', 'your_database');

// 检查连接是否成功
if ($mysqli->connect_error) {
    die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
}

总结

  • 修改 MySQL 用户认证插件:将用户的认证插件更改为 mysql_native_password,以确保与 PHP 7.4 兼容。
  • 升级 PHP 和 MySQL 客户端:确保 PHP 使用支持 MySQL 8.0 caching_sha2_password 插件的 mysqlnd 扩展。
  • 更新 MySQL 配置:在 MySQL 配置文件中设置默认认证插件为 mysql_native_password,以确保兼容性。
  • 检查 PHP 连接代码:确保 PHP 使用正确的连接方式,并且相关配置没有问题。

这些解决方案可以帮助你解决 PHP 7.4 与 MySQL 8.0 之间的认证问题。如果问题仍然存在,可能需要考虑升级 PHP 到更高版本,或进一步调试数据库和应用程序的连接设置。