MySQL8.0创建数据库,该如何选择字符集,是选择utf8mb4还是utf8mb3
在 MySQL 8.0 中创建数据库时,选择正确的字符集和排序规则非常重要。这关系到你的数据库能否正确存储和处理各种语言的字符,特别是像表情符号(emoji)这样的特殊字符。
核心推荐 (MySQL 8.0 及以后版本):
- 字符集 (Character Set): 强烈推荐选择
utf8mb4
。 - 排序规则 (Collation): 推荐选择
utf8mb4_0900_ai_ci
(这是 MySQL 8.0 的默认排序规则)。
为什么选择 utf8mb4
而不是 utf8mb3
(或其他)?
-
utf8mb3
(历史上的utf8
):- 含义: 使用最多 3 个字节来存储一个字符。
- 覆盖范围: 只能存储 Unicode 基本多文种平面 (Basic Multilingual Plane, BMP) 中的字符。这包括了绝大部分常用的语言字符(如拉丁字母、西里尔字母、大部分中日韩字符等)。
- 缺点: 无法存储需要 4 个字节的 Unicode 字符。最常见的例子就是表情符号 (emoji),还有一些不常用的汉字、数学符号、音乐符号等。
- 历史: 在 MySQL 5.5.3 之前,MySQL 中的
utf8
实际上就是utf8mb3
的别名。为了避免混淆并明确支持完整的 UTF-8,MySQL 后来引入了utf8mb4
并将旧的utf8
指向utf8mb3
。在 MySQL 8.0 中,utf8mb3
被视为遗留字符集。
-
utf8mb4
:- 含义: 使用最多 4 个字节来存储一个字符。
- 覆盖范围: 能够存储所有 Unicode 字符,包括 BMP 字符和辅助平面 (Supplementary Planes) 中的字符(如 emoji 和罕见字符)。
- 优点: 提供了最广泛的字符支持,是真正意义上的 UTF-8 实现,能够适应现代互联网应用的需求(尤其是移动端 emoji 的广泛使用)。
- MySQL 8.0 默认值: 从 MySQL 8.0 开始,
utf8mb4
及其对应的排序规则utf8mb4_0900_ai_ci
成为了默认的字符集和排序规则,这表明了官方的推荐方向。
-
其他字符集 (如
latin1
,gbk
等):latin1
(ISO 8859-1): 主要支持西欧语言,无法存储中文、日文、韩文、emoji 等。gbk
: 主要用于简体中文,但不是国际标准,不支持繁体中文、日韩文、emoji 等。- 这些字符集在需要支持多语言或现代字符(如 emoji)的场景下,兼容性远不如
utf8mb4
,不推荐在新项目中使用。
总结 utf8mb3
vs utf8mb4
的关键区别:
特性 | utf8mb3 (旧称 utf8 ) | utf8mb4 |
---|---|---|
最大字节数 | 3 字节 | 4 字节 |
Unicode 范围 | 基本多文种平面 (BMP) | 所有 Unicode 字符 (包括辅助平面) |
Emoji 支持 | 不支持 | 支持 |
MySQL 8.0 推荐 | 不推荐 (视为遗留) | 强烈推荐 (默认值) |
关于排序规则 (Collation):
排序规则定义了字符集内字符的比较和排序方式。它会影响 ORDER BY
, GROUP BY
, 字符串比较 (=
, >
, <
等) 以及索引的使用。
utf8mb4_0900_ai_ci
: 这是 MySQL 8.0 推荐的utf8mb4
默认排序规则。0900
: 指的是基于 Unicode Collation Algorithm (UCA) 9.0.0 版本,提供了更准确、更符合现代语言习惯的排序。ai
: Accent Insensitive (不区分重音符号)。例如,‘a’ 和 ‘á’ 在比较时被视为相等。ci
: Case Insensitive (不区分大小写)。例如,‘a’ 和 ‘A’ 在比较时被视为相等。
- 其他常见排序规则:
utf8mb4_general_ci
: 较旧的排序规则,排序准确性不如_0900_
系列,但可能在某些旧场景下性能稍快(差异通常不显著)。不推荐在新项目使用。utf8mb4_unicode_ci
: 比_general_ci
更准确一些,但也不如_0900_
系列。utf8mb4_bin
: 二进制排序。直接比较字符的二进制值,区分大小写、重音,速度最快,但排序结果可能不符合人类语言习惯。utf8mb4_xxxx_as_cs
:as
(Accent Sensitive) 表示区分重音,cs
(Case Sensitive) 表示区分大小写。根据需要选择。- 特定语言的排序规则 (如
utf8mb4_ja_0900_as_cs
for Japanese)。
选择建议:
- 对于绝大多数新项目,直接使用 MySQL 8.0 的默认设置:
CHARACTER SET utf8mb4
和COLLATE utf8mb4_0900_ai_ci
。这提供了最好的兼容性和最准确的通用排序规则(不区分大小写和重音)。 - 如果你需要区分大小写或重音进行比较和排序,可以选择对应的
_cs
或_as
排序规则,例如utf8mb4_0900_as_cs
。 - 除非有非常明确的理由(如与极旧的系统兼容),否则避免使用
utf8mb3
。
如何在创建数据库时指定:
CREATE DATABASE your_database_name
CHARACTER SET utf8mb4
COLLATE utf8mb4_0900_ai_ci;
如果你不指定,MySQL 8.0 会自动使用服务器配置的默认值,通常就是 utf8mb4
和 utf8mb4_0900_ai_ci
。
总之,在 MySQL 8.0 中,请优先并放心地选择 utf8mb4
字符集和 utf8mb4_0900_ai_ci
(或其他 utf8mb4_0900_xx_xx
) 排序规则,以确保最佳的兼容性和功能性。