字符集与排序规则管什么
字符集决定字符怎么存储,排序规则决定字符串怎么比较:大小写是否等价、重音是否等价、排序顺序如何。两者一起决定了主键去重、唯一约束与关联匹配的结果。关系库统一用 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,属于不区分大小写与重音的类型。若业务要求精确匹配券码、序列号这类字段,需要显式指定区分大小写的排序规则,而不是依赖默认值。