dbprefix是默认静态表前缀,自动应用于所有无前缀表名;swap_pre是动态占位符,仅在显式调用或{swap_pre}语法中被替换为当前dbprefix,用于多租户等运行时切换场景。

swap_pre 和 dbprefix 都出现在 CodeIgniter 的 database.php 配置中,作用都跟表前缀有关,但定位、时机和用途完全不同。
dbprefix 是默认表前缀
它定义的是整个应用默认使用的数据库表前缀,写死在配置里,对所有查询生效(除非显式覆盖)。CI 在生成 SQL 时,会自动把 dbprefix 加到没带前缀的表名前面。
- 比如设为
'dbprefix' => 'ci_',调用$this->db->from('user')实际查的是ci_user - 这个值是静态的,启动后基本不变
- 适用于单租户、统一前缀的常规项目
swap_pre 是运行时动态替换符
swap_pre 不是真正的前缀,而是一个占位符字符串,用于在 SQL 查询中做运行时文本替换。它本身不参与表名拼接,只在你主动调用 $this->db->swap_pre() 或使用 {swap_pre} 占位语法时才起作用。
- 例如设为
'swap_pre' => '###',再写查询$this->db->query("SELECT * FROM {swap_pre}user"),CI 会把{swap_pre}替换成当前dbprefix值(如ci_),最终执行SELECT * FROM ci_user - 它支持“按需切换”:你可以在不同请求中临时修改
$this->db->dbprefix,再配合{swap_pre}实现多租户分表 - 常用于分布式或 SaaS 场景,比如用户 A 用
a_,用户 B 用b_,通过动态赋值$this->db->dbprefix = $tenant_prefix+{swap_pre}统一写法
关键区别一句话总结
dbprefix 是 CI 自动生成表名时默认加上的前缀;swap_pre 是你手写 SQL 里用来标记“这里要插前缀”的符号,靠它才能把动态前缀带进原生查询或 Active Record 的特殊场景中。


















