答案:需统一mysql服务端、数据库/表结构、ci连接参数三者为utf8mb4。修改my.cnf的[mysqld]段设character-set-server=utf8mb4,建库建表显式指定utf8mb4,ci的database.php中char_set和dbcollat均设为utf8mb4,并确保php与html也用utf-8。

CodeIgniter 3 本身不控制 MySQL 数据库的字符集,它只负责连接和查询;中文乱码根源在 MySQL 服务端配置、数据库/表结构、连接参数三者不一致。改 CI 配置只是最后一环,不能绕过底层设置。
确认 MySQL 服务端默认字符集是否为 utf8mb4
CI 连接时用什么字符集,取决于 MySQL 服务端给新连接分配的默认值。如果 my.cnf 里没显式设好,character_set_server 很可能还是 latin1,那 CI 即使指定 utf8 也白搭。
- 检查当前值:
SHOW VARIABLES LIKE 'character_set_server';,必须是utf8mb4(不是utf8) - 修改
/etc/my.cnf(Linux)或my.ini(Windows),在[mysqld]段加入:
character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci init_connect = 'SET NAMES utf8mb4'
重启 MySQL 服务后生效。注意:init_connect 能确保普通用户连接时自动执行 SET NAMES,但对 SUPER 权限用户无效(不影响 CI 应用)。
创建数据库和表时必须显式指定 utf8mb4
即使服务端设了 character_set_server,新建数据库/表仍可能继承旧默认值,尤其当 SQL 语句里没写明字符集时。
- 建库命令必须带:
CREATE DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - 建表语句中,每个
VARCHAR/TEXT字段最好也加字符集声明,例如:title VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci - 已有库表可用
ALTER DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;和ALTER TABLE news CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;批量修复
CodeIgniter 3 的 database.php 必须匹配 utf8mb4
CI 的数据库配置只是告诉它“连接时声明用什么字符集”,不是改变 MySQL 本身。如果这里填错,等于主动断开统一链路。
- 打开
application/config/database.php,找到$db['default']数组 - 确认以下三项都设为
utf8mb4(不是utf8):$db['default']['char_set'] = 'utf8mb4';$db['default']['dbcollat'] = 'utf8mb4_unicode_ci';$db['default']['swap_pre'] = '';(此项无关字符集,但若设错会导致查询失败) - 如果使用 PDO,还需在
$db['default']['DSN']中追加;charset=utf8mb4,例如:mysql:host=localhost;dbname=myapp;charset=utf8mb4
PHP 和 Web 服务器也要同步 UTF-8
字符流从浏览器 → PHP → MySQL 是一串,中间任一环节掉链子都会乱码。
- PHP 文件本身保存为 UTF-8 无 BOM(用 VS Code 或 Notepad++ 检查编码)
- PHP 输出头要声明:
header('Content-Type: text/html; charset=utf-8');,或在php.ini中设default_charset = "UTF-8" - HTML 页面
<meta charset="utf-8">不可少 - CI 的
config.php中确认:$config['charset'] = 'UTF-8';
最容易被忽略的是:MySQL 的 utf8 实际只支持最多 3 字节 Unicode 字符(不含 emoji 和部分生僻中文),必须用 utf8mb4 才真正完整。很多“改了还是乱码”的案例,都是卡在把 utf8 当成万能解,而没升级到 utf8mb4。











