这段文字是 MySQL 官方文档第12章《字符集、排序规则与Unicode》的概述和引言部分,它系统地介绍了 MySQL 中处理不同语言文字(如中文、英文、阿拉伯文等)的核心机制:字符集(Character Set)和排序规则(Collation)

我们可以从以下几个层面来理解这段内容:


一、核心概念:什么是字符集和排序规则?

  1. 字符集(Character Set)

    • 定义:字符集是一套字符的编码规则,规定了每个字符在计算机中如何用二进制存储。
    • 例子
      • utf8mb4:可以存储世界上几乎所有语言的字符,包括中文、emoji(如 😊)、阿拉伯文等。
      • latin1:主要用于西欧语言(如英语、法语),不支持中文。
    • 作用:决定你能存什么文字。
  2. 排序规则(Collation)

    • 定义:排序规则定义了字符在比较和排序时的行为,比如是否区分大小写、是否区分重音符号。
    • 例子
      • utf8mb4_0900_ai_ciai = accent insensitive(不区分重音),ci = case insensitive(不区分大小写)
      • utf8mb4_0900_cs_ascs = case sensitive(区分大小写),as = accent sensitive(区分重音)
    • 作用:决定“A”和“a”是否相等,或者“é”和“e”是否相同。

二、MySQL 的默认设置

  • 当前默认字符集utf8mb4
  • 当前默认排序规则utf8mb4_0900_ai_ci
  • 强烈建议:在新项目中始终使用 utf8mb4,以支持所有 Unicode 字符(尤其是 emoji 和多语言)。

⚠️ 重要警告

  • UTF8utf8mb3过时同义词不支持完整的 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.2MySQL 如何实现字符集支持
12.3如何在建表、建库时指定字符集
12.4客户端连接时的字符集设置
12.5应用程序如何正确配置字符集
12.6错误信息的语言和字符集
12.7修改列的字符集(如从 latin1 转 utf8mb4)
12.8排序规则常见问题(如大小写敏感)
12.9Unicode 支持详解(重点!)
12.10MySQL 支持的所有字符集列表
12.11字符集使用的限制(如索引长度)
12.12设置错误信息的语言
12.13如何添加自定义字符集(高级)
12.14如何添加自定义排序规则(高级)
12.15服务器字符集配置
12.16本地化支持(如月份名语言)

六、关键建议总结

建议说明
✅ 使用 utf8mb4而不是 utf8utf8mb3,确保支持 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)吗?

Logo

分享最新、最前沿的AI大模型技术,吸纳国内前几批AI大模型开发者

更多推荐