codeigniter支持多数据库组独立配置字符集和表前缀;各组可设不同char_set(如utf8mb4、latin1、utf8)及dbprefix(如ci_main_、ci_log_),加载指定组时自动生效。

CodeIgniter 支持多数据库连接,每个数据库组(如 default、log、report)可以独立配置字符集(char_set)和表前缀(dbprefix),不需要全局统一。
每个数据库组单独设字符集
字符集控制数据库连接时的编码行为,影响 SQL 查询和结果的中文/特殊符号处理。不同库用不同字符集时,直接在对应数据库组里设置即可:
-
$db['default']['char_set'] = 'utf8mb4';(主业务库,支持 emoji) -
$db['log']['char_set'] = 'latin1';(日志库,旧系统兼容) -
$db['report']['char_set'] = 'utf8';(报表库,兼容老 MySQL 版本)
注意:char_set 必须与数据库实际创建时指定的字符集一致,否则可能乱码;同时建议配套设置 dbcollat(排序规则),例如 utf8mb4_unicode_ci。
每个数据库组单独设表前缀
表前缀用于区分同一数据库实例下的不同项目或模块的表。多库场景下,各库可使用不同前缀,互不干扰:
$db['default']['dbprefix'] = 'ci_main_';$db['log']['dbprefix'] = 'ci_log_';$db['report']['dbprefix'] = 'ci_rpt_';
这样调用 $this->db->table('user') 时,会自动解析为 ci_main_user;而切换到日志库后(如 $this->load->database('log');),同一条语句就变成 ci_log_user。
切换数据库并确保配置生效
使用非默认库时,必须显式加载并指定组名,其字符集和前缀才会被应用:
-
$this->load->database('log');→ 加载log组全部配置(含char_set和dbprefix) -
$this->load->database('report', TRUE);→ 第二个参数TRUE返回新 DB 实例,避免覆盖默认库 - 可在模型中按需加载:
$log_db = $this->load->database('log', TRUE); echo $log_db->dbprefix;
只要配置写在 application/config/database.php 对应分组内,CI 初始化该连接时就会自动应用这些值,无需额外初始化逻辑。











