MySQL升级后字符集默认从utf8mb3变为utf8mb4、校对规则变为utf8mb4_0900_ai_ci,需全链路统一配置为utf8mb4并验证emoji插入、多语言查询及重音排序。

MySQL 升级后字符集变化,最常见的是从 utf8(实际是 utf8mb3)自动转为 utf8mb4,或默认 collation 从 utf8_general_ci 变为 utf8mb4_0900_ai_ci。这会导致旧应用插入四字节 emoji、某些生僻汉字时报错(如 Incorrect string value),或查询排序/比较行为不一致。核心不是“回退”,而是统一配置 + 平滑适配。
检查并确认当前字符集状态
升级后先执行以下语句,看清真实配置:
-
SHOW VARIABLES LIKE 'character_set%';—— 查看服务端默认字符集 -
SHOW VARIABLES LIKE 'collation%';—— 查看默认校对规则 -
SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'your_db';—— 查看库级设置 -
SHOW CREATE TABLE your_table;—— 看表和字段是否仍是 utf8 / utf8mb3
分层统一字符集(推荐 utf8mb4)
不建议降级回 utf8,而应主动升级到 utf8mb4 全链路支持:
-
服务端:在
my.cnf中明确指定(5.7+ 或 8.0 均适用):
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_0900_ai_ci -
数据库:对已有库执行
ALTER DATABASE db_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci; -
表与字段:逐表转换(注意大表需评估锁和时间):
ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
客户端连接必须显式声明
即使服务端设为 utf8mb4,若客户端连接未指定,仍可能走默认 latin1 或旧 utf8:
- Java JDBC 连接串加参数:
?characterEncoding=utf8mb4&serverTimezone=UTC - PHP mysqli:连接后执行
$mysqli->set_charset("utf8mb4"); - Python PyMySQL:初始化时传参
charset='utf8mb4' - 命令行客户端:启动时加
--default-character-set=utf8mb4,或在my.cnf的[client]段配置
兼容性兜底与验证要点
转换后务必验证三类典型场景:
- 插入含 emoji 的数据(如
INSERT INTO t VALUES ('??');)是否成功 - 含中文、日文平假名、繁体字的模糊查询(
LIKE '%東%' OR LIKE '%あ%')结果是否完整 - ORDER BY 和 GROUP BY 对含重音字符(如 é, ü)是否按预期排序(utf8mb4_0900_ai_ci 区分大小写但忽略重音和大小写变体)
- 若有旧存储过程或函数使用
CONVERT(... USING utf8),需手动改为utf8mb4










