在数据库设计中,选择合适的字符集(Character Set)和排序规则(Collation)是至关重要的。这些选择会影响数据的存储、检索以及比较。以下是一些常见的字符集和排序规则,以及它们的适用场景。
1. 字符集
UTF-8 / UTF8MB4
描述: UTF-8 是一种针对 Unicode 的可变长度字符编码,而 UTF8MB4 是 UTF-8 的超集,支持更多的字符,包括表情符号。
适用场景: 当您的应用需要支持多种语言或特殊字符(如表情符号)时,UTF8MB4 是最佳选择。它是MySQL推荐的字符集。
Latin1
描述: Latin1 ( ISO 8859-1 ) 是一种单字节字符集,支持西欧语言。
适用场景: 如果您的数据主要是英文或西欧语言,并且不包含特殊字符或表情符号, Latin1 是一个轻量且高效的选择。
ASCII
描述: ASCII 是最基本的字符编码,只支持英文字符和一些基本符号。
适用场景: 当您的数据仅包含基本的英文字符和符号时, ASCII 是足够的。这通常适用于一些非常特定和受限的应用场景。
2. 排序规则
MySQL常用排序规则有 utf8mb4_general_ci
、utf8mb4_unicode_ci
、utf8mb4_bin
、utf8mb4_0900_ai_ci
utf8_bin
- 特性: 在 utf8_bin 排序规则中,字符串是通过二进制数据进行编译和存储的。
- 大小写区分: 是。在这种排序规则下,a 和 A 被视为不同的字符。
- 适用场景: 当您需要严格区分大小写或者需要存储二进制内容时。例如,如果您有一个字段需要确切地区分大小写,如密码字段,使用 utf8_bin 是一个合适的选择。
utf8_general_ci
- 特性: utf8_general_ci 是一种不区分大小写的排序规则。它在比较字符串时,不会区分字符的大小写。
- 大小写区分: 否。在这种排序规则下,a 和 A 被视为相同的字符。
- 适用场景: 这个排序规则适用于那些不需要区分大小写的场景,如用户登录时的用户名或邮箱地址。使用 utf8_general_ci 可以确保即使用户在输入时改变了字母的大小写,仍然能够被正确地识别。
其他相关排序规则
utf8mb4_unicode_ci / utf8mb4_general_ci
- 描述: 这些排序规则用于 UTF8MB4 字符集。ci 表示不区分大小写(case-insensitive)。
- 区别: utf8mb4_unicode_ci 基于标准的 Unicode 来排序,而 utf8mb4_general_ci 是一种性能更优的简化排序算法。
- 适用场景: 当您需要确保在多种语言环境下的文本比较和排序的准确性时,utf8mb4_unicode_ci 是更好的选择。如果性能是主要考虑因素,且可以接受稍微粗糙的排序,则可以选择 utf8mb4_general_ci。
utf8_general_cs
- 区分大小写: 是。这个规则在处理字符串时会区分大小写,这在某些场景下可能导致问题,尤其是在不应区分大小写的字段(如邮箱地址)中使用时。
utf8_unicode_ci
- 特性: utf8_unicode_ci 在校对时的准确度更高,但速度稍慢。
- 中英文处理: 对中文和英文来说,与 utf8_general_ci 没有实质性的差别。
- 选择建议: 如果对准确性有较高要求,可以考虑使用 utf8_unicode_ci。
latin1_swedish_ci
- 描述: 这是 Latin1 字符集的默认排序规则,不区分大小写。
- 适用场景: 主要用于处理西欧语言数据,当使用 Latin1 字符集时,默认会采用此排序规则。
binary
描述: 这是一种区分大小写的排序规则,按照字节值进行比较。
适用场景: 当您需要严格区分大小写和特殊字符,或者对数据进行精确的字节级比较时,适合选择 binary 排序规则。
_bin
: 按二进制方式比较字符串,区分大小写和重音符号。_ai_ci
: 按照特定语言或地区方式比较字符串,不区分大小写和重音符号。_unicode_ci
: 按 Unicode 标准方式比较字符串,不区分大小写和重音符号。_general_ci
: 按一般方式比较字符串,不区分大小写和重音符号。ci: 即case insensitive,不区分大小写,即排序时 p 和 P相同 。
ai: 指口音不敏感,即排序时 e,è,é,ê 和 ë 相同。
as: 即口音敏感,也就是说,排序时 e,è,é,ê 和 ë 互不相同。
0900: 是 Unicode 校对算法版本。
utf8mb4_unicode_ci 和 utf8mb4_general_ci 的区别
- 准确性
utf8mb4_unicode_ci
是精确排序, utf8mb4_general_ci
没有实现 Unicode
排序规则,在遇到某些特殊语言或者字符集,排序结果可能不一致。
因此,准确性是 utf8mb4_unicode_ci
> utf8mb4_general_ci
- 性能
- utf8mb4_general_ci 在比较和排序的时候更快。
- utf8mb4_unicode_ci 在特殊情况下, Unicode 排序规则为了能够处理特殊字符的情况, 实现了略微复杂的排序算法。
因此, 性能方面是utf8mb4_general_ci
> utf8mb4_unicode_ci
如果在创建数据库时对特殊字符的顺序并不需要那么精确,排序规则可使用
utf8mb4_general_ci
。推荐用utf8mb4_unicode_ci
,但是用utf8mb4_general_ci
也没问题