首页/数据/数仓建模速查/字符集与排序规则规范
分层与规范64 条

字符集与排序规则规范

关系库统一 utf8mb4 字符集与区分大小写的排序规则(如 utf8mb4_bin 或 utf8mb4_0900_as_cs);大数据侧统一 UTF-8 文件编码。

数仓建模速查数据更新于 2026-10-13

字符集与排序规则管什么

字符集决定字符怎么存储,排序规则决定字符串怎么比较:大小写是否等价、重音是否等价、排序顺序如何。两者一起决定了主键去重、唯一约束与关联匹配的结果。关系库统一用 utf8mb4,大数据侧统一用 UTF-8 文件编码,是避免乱码与误判等的基础。

基本信息

字符集MySQL 侧统一 utf8mb4,可存四字节字符(含 emoji)
排序规则需区分大小写时用 utf8mb4_bin 或 utf8mb4_0900_as_cs
易错点utf8mb3(旧称 utf8)只支持三字节,存不了四字节字符
大数据侧文本文件统一 UTF-8,避免平台默认编码差异
三层一致库、表、列以及连接字符集都要一致

典型使用场景

  • 新建数据库:在建库阶段一次性定好字符集与排序规则
  • 迁移历史库:源库排序规则不区分大小写,迁到目标库后去重行为发生变化
  • 存 emoji 或生僻字:三字节字符集直接插入失败或乱码
  • 大小写敏感的业务主键:券码、订单号大小写不同视为不同记录
  • 跨库关联:两侧排序规则不同时,字符串比较结果与预期不符

建库与核查

建库与核查
-- 建库时同时指定字符集与排序规则,避免继承服务端默认值
CREATE DATABASE corp_dw
  DEFAULT CHARACTER SET utf8mb4
  DEFAULT COLLATE utf8mb4_0900_as_cs;   -- as_cs 表示区分重音与大小写

-- 已有表要逐张核查,重点看列的字符集是否与库一致
SHOW CREATE TABLE dwd_trade_order_di;
SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_COLLATION
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'corp_dw';          -- 确认没有残留的旧排序规则

常见排序规则对照

排序规则大小写典型用途
utf8mb4_bin区分(按二进制比较)券码、标识类字段的精确匹配
utf8mb4_0900_as_cs区分大小写与重音MySQL 8.0 的严格比较场景
utf8mb4_0900_ai_ci不区分大小写与重音MySQL 8.0 默认,做普通文本检索
utf8mb4_general_ci不区分大小写旧版本常见默认值,规则较粗糙
不区分大小写的排序规则会让 ABC 与 abc 被判为相等,影响的不是排序显示,而是主键去重与唯一约束:本该两条不同记录的数据会被判为重复而丢弃。
MySQL 8.0 的默认排序规则是 utf8mb4_0900_ai_ci,属于不区分大小写与重音的类型。若业务要求精确匹配券码、序列号这类字段,需要显式指定区分大小写的排序规则,而不是依赖默认值。

易错点

  • 迁移时字符集不一致,中文或四字节字符乱码,且回补需要重导数据
  • 忽略排序规则差异,源库区分大小写的去重逻辑迁到目标库后变成不区分,重复数据被静默合并
  • 只在建表时指定字符集,未同步调整连接字符集,写入时仍按另一套编码解释,出现问号乱码
  • 使用旧的三字节 utf8 存四字节字符,插入报错或截断,业务侧只在特定输入下偶发失败

数据来源与参考

  • MySQL 8.0 Reference Manual: Character Sets
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌