codeigniter表前缀必须在application/config/database.php中$db'default'配置为非空字符串(如'ci_'),全局生效且影响table_exists、protect_identifiers等方法;多数据库组需单独配置,迁移和seeder自动应用前缀,原生sql需手动处理。

数据库配置文件里改 $db['default']['prefix']
CodeIgniter 的表前缀不是在模型或查询时临时加的,而是全局生效的配置项,必须在数据库配置中声明。默认配置位于 application/config/database.php,找到 $db['default'] 数组,直接设置 'prefix' 键即可。
- 值必须是字符串,哪怕为空也要写成
'',不能留空或设为null,否则后续调用$this->db->table_exists()等方法可能报错 - 如果项目已上线且表名带前缀(比如
ci_users),但配置里没设prefix,那么$this->db->from('users')实际查的是users表,而不是ci_users,容易查不到数据 - 前缀末尾不自动补下划线,所以得自己写全,比如想用
ci_,就得明确写'prefix' => 'ci_',写成'ci'就会生成ciusers
$this->db->protect_identifiers() 会受前缀影响
这个函数默认开启前缀拼接,只要 prefix 配置了非空字符串,它就会把表名自动加上前缀再转义。这在动态拼 SQL 时容易误判。
- 比如执行
$this->db->protect_identifiers('users'),当prefix是'ci_'时,结果是`ci_users`;设为空则只是`users` - 如果你在迁移脚本或安装逻辑里用它生成建表语句,又忘了重置前缀(比如临时设为
''),就可能反复加前缀,变成ci_ci_users - 调试时可用
var_dump($this->db->protect_identifiers('users', true, false))跳过前缀处理——第三个参数false表示不应用前缀
多数据库组共用前缀?得单独配每个组
CodeIgniter 不支持“全局前缀”,prefix 是按数据库组定义的。如果你用了多个数据库连接(比如 default 和 slave),它们的前缀可以不同,也完全可以一个有、一个没有。
- 常见错误:只改了
$db['default']['prefix'],但读库走的是$db['slave'],结果读写表名不一致,关联查询失败 - 若需统一,得显式复制,比如
$db['slave']['prefix'] = $db['default']['prefix']; - 注意
$db['default']是键名,不是固定值——如果你改成了$db['production']作为主连接,那就要改那个键下的prefix
迁移文件和 Seeder 里要不要手动加前缀?
不需要。CodeIgniter 的 dbforge 和 seeder 都会自动读取当前活动数据库组的 prefix 配置。
- 写迁移时用
$this->dbforge->add_field('id')+$this->dbforge->create_table('users'),生成的表就是ci_users(假设前缀是ci_) - Seeder 中
$this->db->insert('users', [...])同样走前缀,不用写成'ci_users' - 唯一例外:你用原生 SQL,比如
$this->db->query("SELECT * FROM users"),这时前缀不会自动加,得自己拼,或者用$this->db->platform()判断类型再处理
实际改配置时最容易漏掉的是数据库组名匹配和空字符串边界——前缀设成 '' 和没设是两回事,前者明确关闭前缀,后者可能让底层逻辑 fallback 出意外结果。










