MySQL utf8mb3 → utf8mb4 完整修改方案
utf8 在 MySQL 里实际是
utf8mb3,最多存3字节,不能存emoji、生僻汉字 ;utf8mb4是真正完整utf‑8,支持全部Unicode字符(4字节)。
一、先搞清楚3个层级:数据库、表、字段
必须三层都检查,只改表不改字段不会生效。
1、修改数据库默认字符集(新建表才会继承)
sql
ALTER DATABASE 你的库名 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
2、单张表整体修改
sql
ALTER TABLE `表名` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
这条语句同时会自动把表内所有字符型字段(char/varchar/text)转成mb4,最省事。
3、如果只想单独修改某个字段(不推荐优先用)
sql
ALTER TABLE `表名` MODIFY `字段名` VARCHAR(255)
CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
⚠️必须带上原来字段长度、是否null、默认值,不然属性会丢。
二、批量修改库下面所有表(SQL生成脚本)
执行下面这条查询,生成所有表的alter语句,复制结果执行即可
sql
SELECT CONCAT('ALTER TABLE `',TABLE_NAME,'` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA='你的数据库名' AND TABLE_TYPE='BASE TABLE';
三、必须改连接参数!非常关键
只改库表,程序连接字符串没改还是会继续存mb3
JDBC(Java)
url末尾加上
useUnicode=true&characterEncoding=utf8mb4
驱动版本比较老时,
characterEncoding=utf8mb4识别不了,可以写utf‑8,同时还要设置
java
jdbc:mysql://ip:port/db?useUnicode=true&characterEncoding=UTF-8&connectionCollation=utf8mb4_unicode_ci
my.cnf / my.ini 全局配置(服务器端)
ini
[mysqld]
character‑set‑server=utf8mb4
collation‑server=utf8mb4_unicode_ci
[client]
default‑character‑set=utf8mb4
改完重启MySQL。
四、校验是否修改成功
查看表字符集
sql
SHOW CREATE TABLE 表名;
查看字段字符集
sql
SELECT COLUMN_NAME,CHARACTER_SET_NAME,COLLATION_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA='库名' AND TABLE_NAME='表名';
五、常见坑
- 索引长度报错
utf8mb4一个字符占4字节,varchar(255)索引最大767字节限制,InnoDB引擎下超过会报错
解决:
- 缩短索引字段长度
- 开启
innodb_large_prefix
-
已有乱码数据:只能改之后新写入的数据正常,旧乱码需要单独修复
-
排序规则尽量统一用
utf8mb4_unicode_ci,不要继续保留utf8_general_ci