MySQL字符集与排序规则完全指南
·
这段文字是 MySQL 官方文档第12章《字符集、排序规则与Unicode》的概述和引言部分,它系统地介绍了 MySQL 中处理不同语言文字(如中文、英文、阿拉伯文等)的核心机制:字符集(Character Set)和排序规则(Collation)。
我们可以从以下几个层面来理解这段内容:
一、核心概念:什么是字符集和排序规则?
-
字符集(Character Set)
- 定义:字符集是一套字符的编码规则,规定了每个字符在计算机中如何用二进制存储。
- 例子:
utf8mb4:可以存储世界上几乎所有语言的字符,包括中文、emoji(如 😊)、阿拉伯文等。latin1:主要用于西欧语言(如英语、法语),不支持中文。
- 作用:决定你能存什么文字。
-
排序规则(Collation)
- 定义:排序规则定义了字符在比较和排序时的行为,比如是否区分大小写、是否区分重音符号。
- 例子:
utf8mb4_0900_ai_ci:ai= accent insensitive(不区分重音),ci= case insensitive(不区分大小写)utf8mb4_0900_cs_as:cs= case sensitive(区分大小写),as= accent sensitive(区分重音)
- 作用:决定“
A”和“a”是否相等,或者“é”和“e”是否相同。
二、MySQL 的默认设置
- 当前默认字符集:
utf8mb4 - 当前默认排序规则:
utf8mb4_0900_ai_ci - 强烈建议:在新项目中始终使用
utf8mb4,以支持所有 Unicode 字符(尤其是 emoji 和多语言)。
⚠️ 重要警告:
UTF8是utf8mb3的过时同义词,不支持完整的 Unicode(比如 emoji)。utf8mb3只能存储最多 3 字节的 UTF-8 字符,而utf8mb4支持 4 字节,能完整支持所有 Unicode。- 未来版本的 MySQL 会移除
UTF8,所以应使用utf8mb4。
三、字符集可以“多层级”设置
MySQL 允许你在多个层级指定字符集和排序规则,优先级从高到低:
| 层级 | 说明 |
|---|---|
| 1. 字符串字面量 | SELECT '你好' COLLATE utf8mb4_unicode_ci; |
| 2. 列(Column) | CREATE TABLE t (name VARCHAR(50) CHARACTER SET utf8mb4); |
| 3. 表(Table) | CREATE TABLE t (...) DEFAULT CHARSET=utf8mb4; |
| 4. 数据库(Database) | CREATE DATABASE db CHARACTER SET utf8mb4; |
| 5. 服务器(Server) | 在 my.cnf 中设置 character-set-server=utf8mb4 |
👉 低层级的设置会覆盖高层级的默认值。
四、客户端与服务器的通信字符集
字符集不仅影响数据存储,还影响客户端与服务器之间的通信。
例如,如果你的客户端(如 PHP、Python 程序或命令行)使用 latin1 编码发送数据,但服务器期望 utf8mb4,就会出现乱码。
✅ 解决方法:连接后立即设置通信字符集:
SET NAMES 'latin1';
这相当于同时设置三个会话变量:
SET character_set_client = latin1;
SET character_set_results = latin1;
SET character_set_connection = latin1;
📌 推荐做法:客户端和服务器都使用 utf8mb4,避免乱码。
五、本章涵盖的主要内容(目录解析)
| 小节 | 内容简述 |
|---|---|
| 12.1 | 基础概念:字符集 vs 排序规则 |
| 12.2 | MySQL 如何实现字符集支持 |
| 12.3 | 如何在建表、建库时指定字符集 |
| 12.4 | 客户端连接时的字符集设置 |
| 12.5 | 应用程序如何正确配置字符集 |
| 12.6 | 错误信息的语言和字符集 |
| 12.7 | 修改列的字符集(如从 latin1 转 utf8mb4) |
| 12.8 | 排序规则常见问题(如大小写敏感) |
| 12.9 | Unicode 支持详解(重点!) |
| 12.10 | MySQL 支持的所有字符集列表 |
| 12.11 | 字符集使用的限制(如索引长度) |
| 12.12 | 设置错误信息的语言 |
| 12.13 | 如何添加自定义字符集(高级) |
| 12.14 | 如何添加自定义排序规则(高级) |
| 12.15 | 服务器字符集配置 |
| 12.16 | 本地化支持(如月份名语言) |
六、关键建议总结
| 建议 | 说明 |
|---|---|
✅ 使用 utf8mb4 | 而不是 utf8 或 utf8mb3,确保支持 emoji 和所有语言 |
✅ 排序规则选 utf8mb4_0900_ai_ci | 这是现代 MySQL 的推荐默认值 |
| ✅ 统一客户端与服务器字符集 | 避免乱码,建议都用 utf8mb4 |
| ✅ 建库建表时显式指定字符集 | 避免依赖默认值,提高可移植性 |
七、实际应用示例
-- 1. 创建数据库时指定字符集
CREATE DATABASE mydb
CHARACTER SET utf8mb4
COLLATE utf8mb4_0900_ai_ci;
-- 2. 创建表时指定
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
) DEFAULT CHARSET=utf8mb4;
-- 3. 连接后设置通信字符集
SET NAMES 'utf8mb4';
-- 4. 查询时强制排序规则
SELECT * FROM users ORDER BY name COLLATE utf8mb4_bin;
✅ 总结一句话:
MySQL 通过
字符集决定“能存什么字”,通过排序规则决定“怎么比较这些字”。为了支持中文、emoji 和国际化,应始终使用utf8mb4字符集,并注意客户端与服务器的字符集一致,避免乱码问题。
如果你正在开发一个支持多语言的应用,这一章的内容至关重要。需要我帮你分析具体场景(如从 utf8 升级到 utf8mb4)吗?
更多推荐


所有评论(0)