PHP连接MySQL5.7和8.0时,由于两个版本的核心机制调整,会出现连接不兼容的情况,需要针对性调整连接配置和代码逻辑。

PHP连接MySQL5.7和8.0的核心差异
1. 默认身份认证插件不同
MySQL5.7默认使用mysql_native_password作为身份认证插件,而MySQL8.0将默认认证插件改为了caching_sha2_password,这是两个版本最关键的差异。PHP的mysqli和PDO扩展在早期版本中并不支持caching_sha2_password认证方式,直接使用默认配置连接8.0版本就会出现认证失败的错误。
2. 密码加密规则不同
MySQL5.7的密码加密是基于SHA1算法的,而MySQL8.0的caching_sha2_password插件使用的是SHA256加密算法,加密强度更高,但也导致旧版本的PHP扩展无法解析新的密码加密格式,进而无法完成身份校验。
3. 默认连接参数差异
MySQL8.0默认关闭了部分旧的连接兼容参数,比如默认的字符集配置、TCP连接的相关超时参数和5.7版本有区别,如果PHP连接时没有显式指定对应参数,也可能出现连接异常或者字符集乱码问题。
PHP连接不同版本MySQL的适配方案
方案一:修改MySQL8.0用户认证插件(适配旧PHP版本)
如果使用的PHP版本较低,不支持caching_sha2_password认证,可以修改MySQL8.0中目标用户的认证插件为mysql_native_password,操作步骤如下:
首先登录MySQL8.0数据库,执行以下SQL语句修改用户认证方式:
-- 修改已有用户的认证插件,假设用户名为test_user,主机为localhost ALTER USER 'test_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password'; -- 刷新权限使配置生效 FLUSH PRIVILEGES;
修改完成后,PHP就可以使用和连接MySQL5.7相同的代码连接MySQL8.0了。
方案二:升级PHP版本并调整连接代码(适配原生8.0特性)
如果PHP版本在7.4及以上,扩展已经支持caching_sha2_password认证,可以直接调整连接代码适配MySQL8.0,以下是mysqli和PDO两种扩展的连接示例:
mysqli扩展连接示例
<?php
$host = '127.0.0.1';
$username = 'test_user';
$password = 'your_password';
$database = 'test_db';
$port = 3306;
// 创建连接,显式指定字符集避免乱码
$conn = new mysqli($host, $username, $password, $database, $port);
// 检查连接是否成功
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 设置字符集为utf8mb4,兼容emoji等特殊字符
$conn->set_charset('utf8mb4');
echo "MySQL8.0连接成功";
$conn->close();
?>
PDO扩展连接示例
<?php
$host = '127.0.0.1';
$username = 'test_user';
$password = 'your_password';
$database = 'test_db';
$port = 3306;
try {
// 连接字符串中显式指定字符集和端口
$dsn = "mysql:host=$host;port=$port;dbname=$database;charset=utf8mb4";
$pdo = new PDO($dsn, $username, $password);
// 设置PDO错误模式为异常,方便调试
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "MySQL8.0连接成功";
} catch (PDOException $e) {
echo "连接失败: " . $e->getMessage();
}
?>
方案三:通用兼容连接配置
如果需要代码同时兼容MySQL5.7和8.0版本,可以在连接时增加配置判断,或者统一使用以下兼容配置:
- 无论连接哪个版本,都显式指定字符集为
utf8mb4,避免版本默认字符集差异导致的乱码 - 如果使用MySQL8.0,确保PHP版本不低于7.2,且
mysqli或PDO扩展已更新到支持caching_sha2_password的版本 - 连接时显式指定端口,避免不同版本默认端口不一致的问题
常见连接错误排查
如果连接时出现错误,可以先对照以下常见问题排查:
| 错误提示 | 可能原因 | 解决方法 |
|---|---|---|
| Authentication method caching_sha2_password not supported | PHP扩展不支持MySQL8.0默认认证插件 | 修改用户认证插件为mysql_native_password,或升级PHP版本 |
| Access denied for user | 用户名、密码错误,或用户没有对应主机的访问权限 | 检查账号密码,确认用户host配置是否正确 |
| Unknown character set | 指定的字符集版本不支持 | 将字符集改为utf8或对应版本支持的字符集 |
通过以上差异梳理和适配方案,开发者可以根据自身的PHP版本和MySQL版本选择对应的连接方式,快速解决不同版本的连接兼容问题。