ci框架database.php中必须配置的五个硬性参数是hostname、username、password、database、dbdriver;缺一则$this->db为null,调用query()时直接报fatal error。

database.php 里必须填的五个参数
不设这五个值,$this->db 根本连不上库,直接报 Fatal error: Call to a member function query() on null。它们是硬性依赖项,缺一不可:
-
hostname:数据库服务器地址,本地开发常用"localhost"或"127.0.0.1";Docker 环境注意别写 localhost(容器内解析不到宿主机) -
username:MySQL 用户名,CI3 默认用"root",但生产环境必须换专用账号 -
password:对应用户的密码,空字符串""在本地可行,上线前必须删掉或加密读取 -
database:要连接的具体库名,不是 MySQL 实例名;如果库不存在,CI 不会自动创建,会报Unknown database 'xxx' -
dbdriver:驱动类型,CI3 必须用"mysqli"(不是"mysql",后者已废弃且 PHP 7+ 不支持)
db_debug 和 pconnect 这两个开关怎么选
它们看着小,但直接影响开发效率和线上稳定性:
-
db_debug:设为TRUE时,SQL 错误会直接显示完整语句和错误码(比如Column 'xxx' not found),开发阶段必须开;但上线后若仍为TRUE,可能泄露表结构或查询逻辑,应改为FALSE或用(ENVIRONMENT !== 'production')动态控制 -
pconnect:设为TRUE启用持久连接,看似能省开销,但在 Apache prefork 模式下容易导致连接数爆满、MySQL 报Too many connections;CI3 官方文档明确建议设为FALSE,除非你清楚自己在做什么
char_set 和 dbcollat 配置不对会导致中文乱码
即使数据库和表本身是 utf8mb4,CI 层没对齐照样存出问号或 Mojibake:
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
-
char_set必须和数据库实际字符集一致,推荐"utf8mb4"(不是"utf8",后者只支持 3 字节 Unicode) -
dbcollat要匹配排序规则,常见搭配是"utf8mb4_unicode_ci"或"utf8mb4_general_ci";若设成"utf8_general_ci"而库是 utf8mb4,插入 emoji 会失败并静默截断 - 这两个值必须和
CREATE DATABASE语句里的声明一致,否则 CI 发送的SET NAMES命令会失效
dbprefix 和 swap_pre 的区别与误用风险
很多人以为它们是同一个功能,其实作用时机和范围完全不同:
-
dbprefix是全局前缀,所有模型调用$this->db->get('users')时,CI 自动拼成SELECT * FROM `ci_users`(假设值为"ci_");但它不会影响原生查询,比如$this->db->query("SELECT * FROM users")就不会加前缀 -
swap_pre是替换标记,用于在 SQL 字符串里写占位符,比如设swap_pre = '{pre}',再写$this->db->query("SELECT * FROM {pre}users"),CI 才会把{pre}替换成dbprefix值;不设swap_pre,这种写法就只是字面字符串 - 常见坑:在 migration 或原始 SQL 中混用两者,结果查不到表却找不到原因
真正容易被忽略的是 failover 数组和 save_queries —— 前者极少有人配(但高可用场景必须考虑),后者默认 TRUE 会在内存里存全部 SQL 日志,大并发时可能撑爆内存,CI3 项目跑着跑着变慢,八成是它没关。










