字符集是字符与编码规则的统一定义,规定字符的二进制表示方式;MySQL中utf8mb4为推荐默认字符集,支持1–4字节,兼容中文、emoji及所有语言,需配合校对规则实现存储与比较功能。

字符集(Character Set)在 MySQL 中,指的是“字符 + 编码规则”的统一定义。它规定了哪些字符可以被使用,以及每个字符对应怎样的二进制表示方式——也就是怎么把一个汉字、英文字母、数字或 emoji(比如 ?)存成字节数据。
字符集本质是映射关系
计算机只认 0 和 1,所有文字必须转成字节才能存储。字符集就是这张“翻译表”:
- “中” 在 GBK 中是 0xD6D0(2 字节)
- “中” 在 UTF8MB4 中是 0xE4B8AD(3 字节)
- “?” 在 UTF8MB4 中是 4 字节(0xF09F9880),而老式 utf8(即 utf8mb3)根本存不了
MySQL 常见字符集对比
不同字符集覆盖范围和编码长度不同,直接影响中文、emoji、多语言支持能力:
- latin1:单字节,仅支持西欧字符,不支持中文
- gbk / gb2312:中文友好,但仅限简体中文和部分符号,不支持 emoji 和繁体/日韩文
-
utf8mb3(MySQL 中叫
utf8):最多 3 字节,能存大部分 Unicode 字符,但 跳过四字节字符(如 emoji、部分生僻汉字) - utf8mb4:完整 UTF-8 实现,1–4 字节,推荐作为默认字符集,兼容中文、emoji、所有语言
字符集不是孤立存在的
它总是和 校对规则(Collation) 配套使用:
- 字符集管“怎么存”(编码)
- 校对规则管“怎么比”(排序、大小写是否敏感、中文按拼音还是 Unicode 码点排)
- 例如:
utf8mb4_unicode_ci表示用 utf8mb4 编码,按 Unicode 标准比较且不区分大小写
设置层级影响实际行为
MySQL 支持多级字符集设定,低层级会继承高层级默认值,但可被覆盖:
- 服务器级(
character_set_server)→ 新建库默认用它 - 数据库级(
CREATE DATABASE ... CHARACTER SET utf8mb4)→ 影响该库下所有新表 - 表级、列级可进一步细化,比如某字段专门存大小写敏感密码,用
utf8mb4_bin










