codeigniter与mysql 8.0+兼容性问题核心是认证协议、驱动支持和连接配置不匹配;需将用户认证插件切为mysql_native_password,ci3用mysqli驱动,ci4用pdo或mysqli并补全dsn,php启用对应扩展,hostname统一设为127.0.0.1。

CodeIgniter 与 MySQL 8.0+ 的兼容性问题,核心在于认证协议、驱动支持和连接配置三者不匹配。最常见现象是报错 “Client does not support authentication protocol requested by server” 或连接被拒绝,而非账号密码错误。解决关键不是降级 MySQL,而是让 PHP 和 CodeIgniter 正确适配新协议。
确认并切换 MySQL 用户认证插件
MySQL 8.0 默认使用 caching_sha2_password,而 PHP 7.2–7.3(尤其 Windows 或旧编译版本)的 mysqli 扩展不支持该插件。
- 登录 MySQL 执行以下命令,为应用用户切换回兼容插件:
ALTER USER 'your_db_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';
FLUSH PRIVILEGES;
注意:把 'your_db_user' 和 'your_password' 替换为实际值;@'%' 可根据实际访问来源调整(如 @'localhost')。
确保使用正确的数据库驱动
CI3 和 CI4 对驱动要求不同,混用会直接失败:
-
CI3:禁用已废弃的
mysql驱动(PHP 7+ 已移除),必须设为mysqli:
$db['default']['dbdriver'] = 'mysqli';
-
CI4:只接受
MySQLi或PDO(首字母大写,大小写敏感),推荐PDO并补全 DSN:
public $default = [
'DBDriver' => 'PDO',
'DSN' => 'mysql:host=localhost;dbname=your_db;charset=utf8mb4',
// 其他字段...
];
检查并启用 PHP 扩展
即使配置正确,若扩展未加载,框架仍会报“无法连接”,掩盖真实原因:
- 运行
php -m | grep -i "mysqli\|pdo_mysql"(Linux/macOS)或php -m | findstr mysqli(Windows)确认扩展已启用; - 注意:CLI(命令行)和 Web(如 Apache/FPM)可能加载不同 php.ini,执行
php --ini查看实际路径; - Windows 下确保
php.ini中写的是extension=php_mysqli.dll,不是extension=mysqli; - 注释掉所有
extension=php_mysql.dll或extension=mysql(PHP 7+ 不再支持)。
规避 hostname 解析歧义
在 Linux 服务器上写 'localhost' 会强制走 Unix socket,但 PHP 可能找不到 socket 文件(如 /var/run/mysqld/mysqld.sock),报错 No such file or directory:
- 统一将
hostname改为'127.0.0.1',强制走 TCP/IP 连接; - 该做法对 Docker、Windows 及多环境部署更稳定,无副作用。











