21人参与 • 2026-01-25 • Mysql
一句话定调:新项目永远选 utf8mb4 + utf8mb4_0900_ai_ci。
绝大多数“中文乱码/emoji 报错/唯一索引异常/大小写不一致”的锅,最后都能追到:字符集/排序规则没统一。
举个最直观的:
utf8mb4 决定你能不能存 😊utf8mb4_0900_ai_ci 决定 'a' 是否等于 'a'、é 和 e 是否算相等、排序是否更准确| 场景 | 是否必须写 | 说明 |
|---|---|---|
| 本地学习 / 临时库(mysql 8.x 默认 utf8mb4) | 可不写 | 省事,跟 datagrip 一样用 server 默认 |
| 团队项目 / 需要可复现 sql | 建议写 | 固定环境,避免“换机器就炸” |
| 生产环境 / 多环境部署(含 5.7/云厂商) | 必须写 | 防止默认值漂移导致隐蔽数据问题 |
因为它遵循“不写 = 用服务器默认”。
mysql 8.x 常见默认:
character_set_server = utf8mb4collation_server = utf8mb4_0900_ai_ci因此下面两句在“默认未被你改过”的前提下等价:
-- datagrip 默认:不写 create database app_db; -- 显式写:更可控 create database app_db default character set utf8mb4 collate utf8mb4_0900_ai_ci;
show variables like 'character_set_server'; show variables like 'collation_server'; show variables like 'character_set_%'; show variables like 'collation_%';
✅ 建议把“线上默认值截图/记录”写进运维文档,否则迟早有人踩坑。
mysql 里
utf8实际上长期等价于utf8mb3(只支持最多 3 字节),这就是最大误导点。
| 特性 | utf8mb3(utf8) | utf8mb4(推荐) |
|---|---|---|
| 最大字节 | 3 | 4 |
| emoji | ❌ 不支持 | ✅ 支持 |
| unicode 完整性 | ❌ 不完整 | ✅ 完整 |
| mysql 8.x 状态 | deprecated(废弃趋势) | ✅ 默认推荐 |
-- 在 utf8mb3/utf8 表里插入 emoji 往往会失败
insert into user(username) values ('张三😊');
常见错误类似:
incorrect string value: '\xf0\x9f...' for column ...因为这不是“是否需要 emoji”的问题:
排序规则名字拆开看:
utf8mb4_0900_ai_ci
0900:unicode 9.0ai:accent-insensitive(忽略重音)ci:case-insensitive(不区分大小写)✅ 适合:绝大多数业务表、用户输入、通用字符串
特点:
✅ 适合:历史系统已用该排序规则,或需兼容 mysql 5.7
特点:
✅ 适合:密码 hash、token、大小写敏感账号、签名、验证码、唯一标识
特点:
a ≠ a| 后缀 | 含义 | 示例 |
|---|---|---|
_ci | 不区分大小写 | tom = tom |
_cs | 区分大小写(某些 collation 有) | tom ≠ tom |
_bin | 二进制比较,严格区分 | tom ≠ tom |
⚠️ 业务最容易踩的坑:用户名/邮箱用
_ci,你以为tom和tom是两个人,但数据库认为相等,唯一索引直接冲突。
create database app_db default character set utf8mb4 collate utf8mb4_0900_ai_ci;
create database app_db default character set utf8mb4 collate utf8mb4_unicode_ci;
create table user ( id bigint primary key auto_increment, username varchar(50) not null ) engine=innodb default charset=utf8mb4 collate=utf8mb4_0900_ai_ci;
一般不需要,继承库/表的默认即可。
只有在“局部需要强规则”时才做字段级设置:
-- token/密钥/大小写敏感字段 token varchar(64) character set utf8mb4 collate utf8mb4_bin not null;
varchar(255) 最坏是 255 * 4 = 1020 bytesvarchar(191)表现:
illegal mix of collationsutf8mb4_0900_ai_ci 下:tom 和 tom 认为相等_bin 或特定 _cs| 场景 | 字符集 | 排序规则 | 备注 |
|---|---|---|---|
| 新项目(mysql 8) | utf8mb4 | utf8mb4_0900_ai_ci | ⭐ 默认推荐 |
| 老项目兼容(mysql 5.7) | utf8mb4 | utf8mb4_unicode_ci | 兼容优先 |
| 需要严格大小写敏感 | utf8mb4 | utf8mb4_bin | token/签名/账号等 |
| ❌ 不要用 | utf8 / utf8mb3 | - | 历史遗留 |
-- 服务器默认 show variables like 'character_set_server'; show variables like 'collation_server'; -- 数据库定义 show create database app_db; -- 表定义 show create table user; -- 当前连接字符集(很重要,决定客户端发给服务端怎么编码) show variables like 'character_set_client'; show variables like 'character_set_connection'; show variables like 'character_set_results';
跨环境最怕的不是“你写错”,而是“你没写”,让默认值悄悄决定了线上行为。
所以:本地可以省略,项目/生产必须显式指定。
只要把 utf8mb4 + 合理 collation 统一了,乱码、emoji 报错、比较排序异常、mix collations 等问题会少一大半。
到此这篇关于mysql字符集与排序规则utf8mb4、utf8mb3、collation选型与避坑总结的文章就介绍到这了,更多相关mysql utf8mb4、utf8mb3、collation内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论