先查mysql 8.0认证协议兼容性:执行alter user 'user'@'host' identified with mysql_native_password;再验证hostname用127.0.0.1而非localhost,确认mysqli/pdo_mysql扩展已启用,最后用裸连测试定位是环境还是ci配置问题。

CodeIgniter 连接 MySQL 8.0 报错,绝大多数情况不是框架写错了,而是 MySQL 8.0 的默认认证方式、PHP 扩展支持或网络配置没对齐。别急着改 model 或 controller,先聚焦在“能不能连上”这个最底层环节。
确认 MySQL 用户认证协议是否兼容
MySQL 8.0 默认使用 caching_sha2_password 插件,而 PHP 7.2 以下版本的 mysqli/pdo_mysql 原生不支持,会报类似 Client does not support authentication protocol requested by server 的错误。
- 登录 MySQL(用 root 或高权限账号)执行:
ALTER USER 'your_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 如果是远程连接,把
localhost换成对应 host,比如'%'或具体 IP - 执行
FLUSH PRIVILEGES;生效 - 开发环境推荐此方案;生产环境建议升级 PHP 到 7.4+ 并启用 OpenSSL 支持
检查 hostname 和连接方式是否匹配
CI 配置里写 'localhost' 在 Linux 服务器上容易失败——它会强制走 Unix socket,但 PHP 可能找不到 /var/run/mysqld/mysqld.sock,报错 (HY000/2002): No such file or directory。
- 把
hostname改成'127.0.0.1',强制走 TCP/IP,绕过 socket 路径问题 - Windows 或 Docker 环境也建议统一用
127.0.0.1,避免 DNS 解析或 host 文件干扰 - 确认 MySQL 的
bind-address允许该地址访问(如设为127.0.0.1就不能用localhost,反之亦然)
验证 PHP 扩展和运行环境是否就绪
CI 报“Unable to connect”,但你确信账号密码没错?大概率是 mysqli 或 pdo_mysql 根本没加载成功。
- 命令行运行:
php -m | grep -i mysqli(Linux/macOS)或php -m | findstr mysqli(Windows) - 注意 CLI 和 Web(FPM/Apache)可能加载不同 php.ini:运行
php --ini查看真实路径 - CI4 必须用
MySQLi或PDO驱动,mysql已彻底弃用;CI3 也应禁用已移除的mysql_*扩展 - 若用 PDO,CI4 的
Database.php中必须补全'DSN'字段,例如:'mysql:host=127.0.0.1;dbname=testdb;charset=utf8mb4'
快速裸连测试,定位问题层级
别让 CI 框架干扰判断——写一个独立的 test_db.php,只用原生 PHP 连接:
- 内容示例:
<?php <br>$link = mysqli_connect('127.0.0.1', 'user', 'pass', 'dbname');<br>if (!$link) die('Connect failed: ' . mysqli_connect_error());<br>echo 'OK';<br>?> - 如果裸连失败 → 问题在服务器环境、账号权限或 MySQL 服务本身
- 如果裸连成功 → 再回头查 CI 配置加载路径、.env 权限、
DBDriver大小写、缓存是否清空(CI4 要php spark cache:clear)











