MySQL utf8mb3 → utf8mb4 完整修改方案

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='表名';

五、常见坑

  1. 索引长度报错
    utf8mb4一个字符占4字节,varchar(255) 索引最大767字节限制,InnoDB引擎下超过会报错
    解决:
  • 缩短索引字段长度
  • 开启 innodb_large_prefix
  1. 已有乱码数据:只能改之后新写入的数据正常,旧乱码需要单独修复

  2. 排序规则尽量统一用 utf8mb4_unicode_ci,不要继续保留 utf8_general_ci

相关推荐
非优秀程序员1 小时前
第02章 杭电的英语老师与一台服务器|《互联网产品恩仇录》
数据库·node.js·代码规范
SelectDB6 小时前
SelectDB 是哪个公司的?是国产数据库吗?一篇讲清飞轮科技与 Apache Doris 的关系
数据库
这个DBA有点耶6 小时前
库内计算推理:一条SQL背后的算子融合,和外挂方案差了几次网络往返
数据库·人工智能·sql
这个DBA有点耶8 小时前
函数索引的“完全一致”有多苛刻:写法、字符集、类型,差一处就失效
数据库·mysql·代码规范
星恒随风8 小时前
MySQL 从零入门(三):表的约束详解
linux·服务器·数据库·笔记·mysql
Alluxio9 小时前
Alluxio + OCI:为 AI 工作负载实现亚毫秒访问延迟与可扩展吞吐
运维·数据库·人工智能·分布式·缓存·ai·语言模型
数据库急诊室_阿哲12 小时前
一次加索引建议的复核记录:从报告到签字
数据库·ai数据库
青瓦梦滋13 小时前
Redis主从复制
服务器·数据库·redis·缓存·bootstrap
慧都小妮子14 小时前
Wyn商业智能国产数据库适配:数据接入、分析缓存与审计日志验证清单
数据库·数据分析·数据可视化·审计日志·商业智能
Joy T15 小时前
Redis Lua 原子限流:Lua 脚本、竞态条件与并发控制
数据库·redis·lua·限流·竞态条件·redis scripting