mysql 8.0连接失败主因是caching_sha2_password插件不被旧版php/客户端支持,需用alter user切换为mysql_native_password并flush privileges,同时确保php启用mysqli、ci配置hostname为127.0.0.1而非localhost。

直接改用户认证插件,别碰配置文件里的 default_authentication_plugin —— 它对已有用户完全无效。
先确认是不是 caching_sha2_password 导致的
CodeIgniter 报 Unable to connect to your database server 或 Authentication plugin 'caching_sha2_password' cannot be loaded,90% 是这个原因。别猜,进 MySQL 命令行执行:
SELECT user, host, plugin FROM mysql.user WHERE user = 'your_db_user';
重点看 plugin 列。如果是 caching_sha2_password,且你用的是 PHP 7.4 以下、或没更新 mysqli 扩展的环境,基本就是它了。注意:'your_db_user'@'localhost' 和 'your_db_user'@'%' 是两个独立用户,必须分别查。
执行 ALTER USER 并立刻 FLUSH PRIVILEGES
在 MySQL 中运行(把 your_db_user、your_password、host 换成实际值):
ALTER USER 'your_db_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';<br>FLUSH PRIVILEGES;
-
host必须和上一步SELECT结果完全一致,一个空格都不能错 - 如果提示
ERROR 1396,说明该用户不存在,先CREATE USER 'your_db_user'@'localhost' IDENTIFIED BY 'your_password';再ALTER - 若 CodeIgniter 连的是 IP(比如
192.168.1.100),就得改对应'your_db_user'@'192.168.1.100',不是localhost - 云数据库(如阿里云 RDS)只允许走这条路,
/etc/my.cnf是锁死的
PHP 和 CodeIgniter 环境要同步检查
光改 MySQL 不够,下面三点漏一个都会失败:
- 确保
mysqli和pdo_mysql在php.ini中已启用:extension=mysqli、extension=pdo_mysql;改完重启 PHP-FPM 或 Apache - CodeIgniter 配置里
hostname别写localhost—— Linux 下它强制走 Unix socket,容易报(HY000/2002): No such file or directory;换成127.0.0.1更稳 - 检查 CLI 和 Web 环境是否加载同一份
php.ini:运行php --ini和phpinfo()对比路径,常见坑是改了 Apache 的却忘了 FPM 的
最容易被忽略的是:即使改了插件,Navicat、DBeaver 或某些连接池会缓存旧握手逻辑,不重启客户端就可能复现失败。还有,密码含 @、/ 等特殊字符时,CodeIgniter 的 .env 文件可能解析异常,临时换纯字母数字密码验证更省事。











