mysql 8.0默认字符集改为utf8mb4,因其是完整utf-8实现(支持4字节unicode字符),而旧utf8实为utf8mb3、仅支持3字节,无法存储emoji及生僻汉字,否则报incorrect string value。

MySQL 5.5.3+ 必须用 utf8mb4,utf8 不行
MySQL 的 utf8 实际是阉割版,最多只支持 3 字节字符(U+0000–U+FFFF),而 emoji 大量使用 4 字节 Unicode 码位(如 ? U+1F308、? U+1F44D)。直接设 utf8 会导致插入失败或被静默截断。从 5.5.3 起官方提供完整 UTF-8 实现 utf8mb4,必须显式启用。
服务端、数据库、表、列四层都要设 utf8mb4
只改其中一层没用——比如只改表字符集,但连接用的是 latin1,照样乱码。关键点:
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
- 在
my.cnf(Linux)或my.ini(Windows)的[mysqld]段下加:[mysqld]<br>character-set-server = utf8mb4<br>collation-server = utf8mb4_unicode_ci
- 重启 MySQL 后确认生效:
SHOW VARIABLES LIKE 'character_set_server';和SHOW VARIABLES LIKE 'collation_server'; - 新建数据库时指定:
CREATE DATABASE db_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - 已有表需逐个转换:
ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; - 特别注意:如果列类型是
TEXT或VARCHAR,且原长度接近上限(如VARCHAR(255)),转utf8mb4后实际存储字节数翻倍(最大 4 字节/字符),可能触发row size too large错误。此时要先缩小字段长度,或改用TEXT类型
客户端连接必须声明 utf8mb4,不能依赖默认
即使服务端全设对了,应用连接时没声明字符集,MySQL 仍按 character_set_client 解析请求,导致写入乱码或报错 Incorrect string value。不同场景处理方式:
- 命令行客户端:启动时加
--default-character-set=utf8mb4,或连接后执行SET NAMES utf8mb4; - PHP PDO:DSN 中加
;charset=utf8mb4,例如mysql:host=localhost;dbname=test;charset=utf8mb4;不要只靠set_charset('utf8mb4'),它不保证初始化阶段正确 - Java JDBC:URL 加参数
?characterEncoding=utf8mb4&serverTimezone=UTC(注意是utf8mb4,不是utf8) - Node.js mysql2:配置项
charset: 'utf8mb4',不是'UTF8'或'utf8'
utf8mb4_unicode_ci 和 utf8mb4_0900_as_cs 怎么选?
排序规则影响大小写敏感性和性能,常见组合:
-
utf8mb4_unicode_ci:兼容老版本,不区分大小写,对 emoji 支持稳定,适合大多数中文+emoji 场景 -
utf8mb4_0900_as_cs(MySQL 8.0+):大小写敏感、重音敏感,排序更精确,但部分旧应用可能因大小写判断逻辑出问题 - 避免用
utf8mb4_general_ci:已弃用,Unicode 排序行为不一致,emoji 排序可能错乱 - 建表时显式指定,别依赖库级默认值,否则迁移时容易漏掉
utf8 而不是 utf8mb4。










