Quiet
  • 主页
  • 归档
  • 分类
  • 标签
  • 链接
  • 关于我

bajiu

  • 主页
  • 归档
  • 分类
  • 标签
  • 链接
  • 关于我
Quiet主题
  • 数据库

mysql数据库选择字符集和排序规则

bajiu
服务端

2024-12-05 14:00:27

在数据库设计中,选择合适的字符集(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 校对算法版本。

mysql_0

utf8mb4_unicode_ci 和 utf8mb4_general_ci 的区别

  1. 准确性

utf8mb4_unicode_ci 是精确排序, utf8mb4_general_ci 没有实现 Unicode 排序规则,在遇到某些特殊语言或者字符集,排序结果可能不一致。

因此,准确性是 utf8mb4_unicode_ci > utf8mb4_general_ci

  1. 性能
  • utf8mb4_general_ci 在比较和排序的时候更快。
  • utf8mb4_unicode_ci 在特殊情况下, Unicode 排序规则为了能够处理特殊字符的情况, 实现了略微复杂的排序算法。

因此, 性能方面是utf8mb4_general_ci > utf8mb4_unicode_ci

mysql_02

如果在创建数据库时对特殊字符的顺序并不需要那么精确,排序规则可使用utf8mb4_general_ci 。推荐用 utf8mb4_unicode_ci,但是用 utf8mb4_general_ci 也没问题

上一篇

DockPanel面板教程

下一篇

微信小程序生成二维码

©2025 By bajiu.