数据库字符集与排序规则对照

更新于 2026年8月14日

适用人群:遇到中文 / Emoji 乱码,或需要正确设置数据库字符集的站长与开发者。

核心概念

关键概念

  • 字符集(Charset):字符如何编码存储,决定能存哪些字符。
  • 排序规则(Collation):字符如何比较和排序,决定 =ORDER BY 的行为(是否区分大小写 / 重音)。

常用字符集对照

字符集 每字符字节 能否存 Emoji 说明
utf8mb4 1–4 推荐,真正的完整 UTF-8
utf8 (utf8mb3) 1–3 不能 MySQL 的历史遗留,存 Emoji 会报错
latin1 1 不能 存中文乱码,避免使用

常用排序规则

排序规则 特点
utf8mb4_unicode_ci 不区分大小写,通用性好
utf8mb4_0900_ai_ci MySQL 8 默认,速度快、不区分重音
utf8mb4_bin 按二进制比较,区分大小写

实际示例

建库 / 建表指定 utf8mb4

CREATE DATABASE app DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci;

CREATE TABLE posts (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  title VARCHAR(200)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

查看与修改现有库表字符集

-- 查看
SHOW VARIABLES LIKE 'character_set_%';
SHOW CREATE TABLE posts;

-- 将已有表转换为 utf8mb4
ALTER TABLE posts CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

连接层也要用 utf8mb4,否则仍可能乱码:

# my.cnf
[client]
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

常见错误

  • ⚠️用 MySQL 的 `utf8`(实为 utf8mb3)存 Emoji,插入时报 “Incorrect string value” 错误
  • ⚠️库 / 表 / 连接三处字符集不一致,数据存进去正常、读出来乱码
  • ⚠️只改了字符集没改排序规则,导致大小写敏感行为不符合预期

对应工具

常见问题

utf8 和 utf8mb4 到底有什么区别?
MySQL 的 `utf8` 是每字符最多 3 字节的阉割版(utf8mb3),无法存储 4 字节字符(如 Emoji、部分生僻字);`utf8mb4` 才是完整 UTF-8,实际项目应统一用 utf8mb4。
已有数据的表能安全转成 utf8mb4 吗?
可以用 `ALTER TABLE ... CONVERT TO CHARACTER SET utf8mb4` 转换,但大表会锁表 / 耗时,建议先备份、在低峰期操作,并注意索引长度限制。

相关教程

相关文章

官方资料来源