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]<br> character-set-server = utf8mb4<br> 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=UTCPHP 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
