codeigniter需在database.php中配置'char_set'=>'utf8mb4'和'dbcollat'=>'utf8mb4_unicode_ci',并确保mysql服务端已启用utf8mb4字符集,否则emoji和生僻汉字会存取异常或截断。

CodeIgniter 本身不直接管理 MySQL 服务端字符集,但必须确保数据库连接层明确使用 utf8mb4,否则即使 MySQL 已配置正确,PHP 应用仍可能以旧编码(如 latin1 或 utf8mb3)通信,导致 emoji、生僻汉字存取异常或截断。
在 database.php 配置文件中指定 charset
这是最关键的一步。打开 application/config/database.php,找到你正在使用的数据库组(通常是 $db['default']),在连接参数中添加或修改以下两项:
'char_set' => 'utf8mb4''dbcollat' => 'utf8mb4_unicode_ci'
完整示例片段:
$db['default'] = array( 'dsn' => '', 'hostname' => 'localhost', 'username' => 'root', 'password' => '', 'database' => 'myapp_db', 'dbdriver' => 'mysqli', 'dbprefix' => '', 'pconnect' => FALSE, 'db_debug' => (ENVIRONMENT !== 'production'), 'cache_on' => FALSE, 'cachedir' => '', 'char_set' => 'utf8mb4', 'dbcollat' => 'utf8mb4_unicode_ci', 'swap_pre' => '', 'encrypt' => FALSE, 'compress' => FALSE, 'stricton' => FALSE, 'failover' => array(), 'save_queries' => TRUE );
确认 MySQL 服务端已支持 utf8mb4
CodeIgniter 的 char_set 只影响连接初始化行为,前提是 MySQL 服务端允许该字符集协商。需确保:
- MySQL 配置文件(
my.cnf或my.ini)中已设置:[mysqld]character-set-server = utf8mb4collation-server = utf8mb4_unicode_ci - 重启 MySQL 服务后,执行
SHOW VARIABLES LIKE 'character_set_server';确认返回值为utf8mb4 - 数据库、表、字段本身也应是
utf8mb4(仅靠 CodeIgniter 配置无法自动转换已有结构)
避免连接时被覆盖的常见陷阱
某些情况会导致连接实际未生效 utf8mb4:
- 使用
mysql扩展(已废弃)而非mysqli或PDO:确保'dbdriver'设为'mysqli'(CI3)或'MySQLi'(CI4) - 手动执行
SET NAMES latin1类语句:检查项目中是否有硬编码的字符集切换操作 - CI3 中若启用了
emulate_prepares = TRUE(PDO 模式下),需额外确认 PDO DSN 包含;charset=utf8mb4(CI3 原生不支持该参数,建议改用 mysqli)
验证是否真正生效
在任意控制器或模型中加入调试代码:
$this->db->query("SET NAMES utf8mb4"); // 强制重设(临时验证用)
$result = $this->db->query("SELECT CHARSET(CONNECTION_ID()) AS cs")->row();
var_dump($result->cs); // 应输出 "utf8mb4"
更可靠的方式是插入一条含 emoji 的测试数据(如 ?你好),再查出来看是否完整无损。











