codeigniter 4迁移命令失败主因是配置路径错误、dbdriver值不规范或cli与web环境php配置不一致:必须用app/config/database.php中完整定义的$default组,dbdriver严格写为'mysql'(非'mysqli'),并确保cli下mysqli扩展已启用且php.ini路径与web环境一致。

CodeIgniter 迁移工具找不到 database.php 配置
迁移命令(如 php spark migrate)启动时根本没加载你的数据库配置,报错类似 Database connection not configured 或直接提示无法连接——这不是密码错了,而是 CI4 的迁移机制压根没读到 app/Config/Database.php。
原因很直接:CI4 的迁移工具默认只认 app/Config/Database.php 中的 $default 组,且要求该组必须是完整、可实例化的配置;它不读 application/config/database.php(那是 CI3 的路径),也不自动加载你自定义的环境配置组(比如 $development)。
- 确认路径是否为
app/Config/Database.php,不是application/config/下的老路径 - 检查类中
public $default属性是否已正确定义,不能是空数组或注释掉 - 若用了多环境配置(如
$development),迁移不会自动切换——必须显式指定:php spark migrate --env development - 确保
$default里所有键都存在:hostname、username、password、database、DBDriver缺一不可
DBDriver 配置值不被迁移工具识别
迁移命令执行时报 Unsupported DBDriver: mysqli 或静默失败,常见于手动改过 DBDriver 值但没对齐框架预期。
CI4 的迁移只支持官方驱动别名,且大小写敏感。例如写 'mysqli' 或 'MySQLi' 都会失败,必须严格用小写 'mysql'(对应 MySQLi 封装)或 'pgsql'、'sqlite' 等标准值。
- 打开
app/Config/Database.php,检查$default->DBDriver = 'mysql';(不是mysqli,不是MySQLi) - 如果用的是 PDO,得写
'pdo',并额外配DBPrefix和DSN字段,仅设DBDriver = 'pdo'不够 - PHP 必须已启用对应扩展:用
'mysql'就要确认mysqli扩展已加载(php -m | grep mysqli)
迁移命令连不上数据库,但应用本身能连
Web 请求下模型查库正常,php spark migrate 却报 Connection refused 或认证失败——说明 CLI 环境和 Web 环境用的不是同一份 PHP 配置。
最常踩的坑是:CLI 调用的 PHP 加载了另一份 php.ini,导致扩展没开、或 openssl / sockets 模块缺失,进而让数据库连接在底层就断了。
- 运行
php --ini查 CLI 实际加载的php.ini路径,和 Web 环境(通过phpinfo()查)比对是否一致 - 在 CLI 的
php.ini中确认extension=mysqli(Linux/macOS)或extension=php_mysqli.dll(Windows)未被注释 - MySQL 8.0+ 用户注意:
caching_sha2_password认证协议在 CLI 下更易暴露兼容问题,临时切回mysql_native_password更快验证
spark migrate 读取到配置却报 SQL 错误
配置路径、驱动、连接都看似正常,但迁移执行时报 SQLSTATE[42000]: Syntax error or access rule violation 或字符集相关错误——这通常是因为迁移工具绕过了 CI4 的模型层,直连数据库后按原始 SQL 执行,对 SQL 模式和字符集更敏感。
尤其当数据库启用了严格模式(STRICT_TRANS_TABLES)或默认字符集是 utf8mb4,而迁移文件里建表语句没显式声明 CHARSET=utf8mb4,就会触发失败。
- 在
app/Config/Database.php的$default中加上:'charset' => 'utf8mb4', 'DBCollat' => 'utf8mb4_unicode_ci' - 检查迁移文件中的
CREATE TABLE语句,末尾补上DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci - 临时禁用严格模式验证(仅调试):
'strictOn' => false,但上线前应回收
DBDriver 值的大小写和命名规范。











