数据库编码及排序规则探讨

  1. 规则

[强制]所有数据表使用 utf8mb4 编码,在创建数据库时指明使用 utf8mb4,会被继承。比较规则统一设置为
utf8mb4 bin”,大小写敏感。
 
  1. 规则的背后

2.1 Charset,Collation

在 MySQL 中,创建数据库时需要指定字符集(Charset)和校对规则(Collation)。
  • Charset 定义了数据库中可以使用的字符集,
  • Collation 则定义了如何比较和排序这些字符。
 
具体来说,字符集 Charset 是指用于存储数据时所采用的编码方式,其目的是为了把各种语言的字符都能够正确地存储在数据库中。MySQL 支持许多不同的字符集,例如 utf8、utf8mb4、gbk 等等。
其中,utf8mb4 是目前最常用的字符集之一它支持包括 Emoji 表情等的所有 Unicode 字符。
 

2.2 以下是 utf8、utf8mb4 和 gbk 三种字符集的比较:

字符集 码点范围 编码方式 最大字节数 支持的字符
utf8 U+0000~U+7F, U+0080~U+FFFF 变长(1-3字节) 3 英文、欧洲语言、中文等部分非常用汉字
utf8mb4 U+0000~U+10FFFF 变长(1-4字节) 4 包含 Emoji 表情在内的所有 Unicode 字符
gbk GBK 标准规定的字符集范围 变长(1-2字节) 2 中文、英文、日文等多种语言,不支持 Emoji
从上表可以看出,这三种字符集的主要区别在于支持的码点范围和最大字节数:
  • utf8:最早的 MySQL 字符集,支持绝大部分常用字符,但不支持 Emoji 表情等一些特殊字符。编码方式为变长编码,最大字节数为 3 字节。
  • utf8mb4:MySQL 5.5.3 版本以后推出的字符集,支持 Unicode 的全部码点范围,包括 Emoji 表情等特殊符号。编码方式为变长编码,最大字节数为 4 字节。
  • gbk:GBK 是中国国家标准 GB 2312-1980 扩展出来的字符集,支持中文、英文、日文等多种语言,但不支持 Emoji 表情等特殊字符。编码方式为变长编码,最大字节数为 2 字节。
 

2.3 如何选择

总之,在选择 MySQL 的字符集时,应根据实际需求选择适合的字符集。
  • 如果需要支持包括 Emoji 表情在内的所有 Unicode 字符,则应该选择 utf8mb4 字符集;
  • 如果只需要支持中文、英文、日文等少数语言,则可以选择 gbk 字符集。
 
而校对规则 Collation 则是指定义了字符集上的比较规则,也就是如何比较和排序字符。
不同的校对规则会影响到数据的查询和排序效果,因此在设定校对规则时需要考虑实际需求。
例如,如果需要对中文进行排序,则应该选择一个适合中文的校对规则。
在 MySQL 中,每个字符集都对应着多种不同的校对规则。
通常情况下,在建库时可以直接使用字符集默认的校对规则,并根据实际需求进行调整。
 
总之,Charset 和 Collation 都是建立数据库时需要指定的重要参数,它们分别定义了数据存储时所采用的编码方式和字符比较规则,对于保证数据的正确性和可靠性至关重要。
 
 

2.4 mysql 中utf8mb4 字符集 collection默认是什么

在 MySQL 中,默认情况下,使用 utf8mb4 字符集时的校对规则(Collation)是 utf8mb4_unicode_ci。这是因为 utf8mb4_unicode_ci 是一个通用的校对规则,可以支持所有 Unicode 字符,并且能够正确地进行排序和比较。
具体来说,utf8mb4_unicode_ci 校对规则会先将字符串进行转换,然后再按照一定的规则进行排序。它会将一些特殊字符转换成常规字符,例如把一些带有变音符号的字符转换为对应的无音符号的字符,以便更好地进行排序和比较。
另外,除了 utf8mb4_unicode_ci 校对规则外,MySQL 还提供了许多其他的校对规则,例如 utf8mb4_bin、utf8mb4_general_ci 等等。这些校对规则都具有不同的特点和适用场景,在实际开发中需要根据实际需求进行选择。
总之,MySQL 中 utf8mb4 字符集默认采用 utf8mb4_unicode_ci 校对规则,这是一个通用的校对规则,可以支持所有 Unicode 字符,并且能够正确地进行排序和比较。
 
 

2.5 collection规则 utf8mb4_unicode_ci vs utf8mb4_bin

以下是 utf8mb4_unicode_ci 和 utf8mb4_bin 两种校对规则的比较:
校对规则 支持字符集 排序方式 大小写敏感 空格敏感 Unicode 字符支持 适用场景
utf8mb4_unicode_ci utf8mb4、utf8 按照 Unicode 字符排序 支持 一般情况下使用
utf8mb4_bin utf8mb4、utf8 按照字节编码排序 不支持 只关注字符编码而不是字符本身的场景(如密码等敏感信息的存储)
从上表可以看出,utf8mb4_unicode_ci 和 utf8mb4_bin 两种校对规则在排序方式、大小写敏感、空格敏感和 Unicode 字符支持等方面均有所不同。具体来说:
  • utf8mb4_unicode_ci 校对规则按照 Unicode 字符进行排序,并且不区分大小写和空格。它支持所有的 Unicode 字符,适合大多数的场景。
  • utf8mb4_bin 校对规则按照字符串的字节编码进行排序,区分大小写和空格。由于不会进行字符转换,可能会导致排序结果错误,并且不支持 Unicode 字符的正确排序和比较。因此,它更适用于只关注字符编码而不是字符本身的场景,如密码等敏感信息的存储。
总之,在选择 MySQL 中的校对规则时,需要根据实际需求选择合适的校对规则。在大多数情况下,应该优先选择 utf8mb4_unicode_ci 校对规则。 那为什么选择utf8mb4_bin呢 请参照下面的 “选择 utf8mb4_bin 校对规则进行排序的场景”

示例:

在实际使用中,排序顺序通常可以通过 ASCDESC 关键字来进行指定,其中 ASC 表示升序,DESC 表示降序。
以下是将 utf8mb4_unicode_ci 和 utf8mb4_bin 校对规则应用于上述例子,并按照升序和降序两种方式进行排序的结果:
  • 使用 utf8mb4_unicode_ci 校对规则进行升序排序时:
  À
  à
  A
  Z
  • 使用 utf8mb4_unicode_ci 校对规则进行降序排序时:
  Z
  A
  à
  À
可以看到,在 utf8mb4_unicode_ci 校对规则下,无论是升序还是降序排序,'À' 和 'à' 的排序位置都是相同的,因为该校对规则不区分大小写和空格,而且会将一些特殊字符转换成常规字符。
  • 对于 utf8mb4_bin 校对规则进行升序排序时:
  A
  Z
  à
  À
  • 对于 utf8mb4_bin 校对规则进行降序排序时:
  À
  à
  Z
  A
可以看到,在 utf8mb4_bin 校对规则下,'À' 和 'à' 的排序位置与 utf8mb4_unicode_ci 校对规则下的结果不同,这是因为该校对规则区分大小写和空格,并直接按照字符编码进行排序,而不会转换字符。
综上所述,在 MySQL 中,排序顺序可以通过 ASCDESC 来进行指定,并且不同的排序规则可能导致不同的排序结果。在选择排序规则时,需要根据实际需求进行选择,以确保查询和排序的准确性。
 
 

2.6 选择 utf8mb4_bin 校对规则进行排序的场景

通常有以下几种:
  • 仅需要关注字符编码而不是字符本身
utf8mb4_bin 校对规则会直接按照字符串的字节编码进行比较和排序,不会进行任何字符转换。因此,在某些情况下,如果只需要关注字符编码而不是字符本身,就可以使用 utf8mb4_bin 校对规则进行排序。
例如,在存储密码等敏感信息时,为了保证数据的安全性,通常会使用哈希函数对密码进行加密,并将加密后的结果存储在数据库中。由于哈希值只包含字符编码而不包含字符本身,因此可以使用 utf8mb4_bin 校对规则进行排序和比较。
  • 需要区分大小写和空格
在某些情况下,可能需要区分大小写和空格,以便更精确地进行查询和排序。例如,在搜索功能中,用户可能会输入大小写不同、带空格或其他标点符号的关键字进行搜索。这时,可以使用 utf8mb4_bin 校对规则进行排序和比较,以确保精确匹配。
  • 性能要求高
由于 utf8mb4_bin 校对规则直接按照字节编码进行排序,比 utf8mb4_unicode_ci 校对规则更加简单高效,因此在某些性能要求较高的场景下,也可以考虑使用 utf8mb4_bin 校对规则进行排序。
总之,utf8mb4_bin 校对规则适用于仅关注字符编码而不是字符本身、需要区分大小写和空格或者对性能要求较高的场景下,但它也有一些局限性,不能支持 Unicode 字符之间的正确排序和比较,因此在选择校对规则时,需要根据实际需求进行选择。
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章