MySQL字符集及其排序规则

MySQL
287
0
0
2024-01-09

本文最后更新于 63 天前,其中的信息可能已经有所发展或是发生改变。

utf8mb4基本介绍

基本特性

  • utf8mb4是MySQL中一种字符集编码,它可以存储和处理Unicode字符。
  • Unicode字符集中包含了几乎所有的字符,包括各种语言的字符、符号、表情符号等。

与utf8mb3的区别

版本上

  • utf8mb4字符集在MySQL的版本5.5.3及之后开始支持。
  • 在此之前的MySQL版本,只支持utf8字符集,即utf8mb3。

编码上

  • 在MySQL中,utf8字符集实际上只支持最多3字节的UTF-8编码。这意味着它无法正确存储和处理一些特殊字符,如一些表情符号和一些辅助字符。
  • 为了解决utf8字符集的限制,MySQL引入了utf8mb4字符集。utf8mb4字符集支持最多4字节的UTF-8编码,可以表示更广泛的字符范围,包括一些特殊字符和表情符号。

utf8mb4排序规则

常见排序规则

  • utf8mb4_general_ci:
  • 默认的排序规则,不区分大小写,同时考虑了多语言的排序规则。
  • 在该规则下,'a'和'A'被认为是相等的。
  • utf8mb4_unicode_ci:
  • 基于Unicode Collation Algorithm (UCA) 默认的排序规则,不区分大小写
  • 与utf8mb4_general_ci相比,utf8mb4_unicode_ci更加精确,能够正确地排序各种语言的字符。
  • utf8mb4_bin:
  • 这个排序规则是基于二进制的排序规则,区分大小写的,且按照字符的二进制值进行排序。
  • 在这个规则下,'A'会排在'a'之前。
  • utf8mb4_0900_ai_ci:
  • 在MySQL 8.0.0版本中引入的,用于支持utf8mb4字符集的全新排序规则。
  • 在MySQL 8.0.0之前的版本中,utf8mb4字符集使用的是utf8mb4_general_ci排序规则。然而,这个排序规则对于一些特定的字符比较不够准确,可能会导致一些排序和比较结果不符合预期。
  • 基于Unicode Collation Algorithm (UCA) 9.0.0的排序规则,不区分大小写,更准确地处理了各种字符的排序和比较。

除了上述常见的排序规则,MySQL还提供了其他一些排序规则,如utf8mb4_unicode_520_ci、utf8mb4_unicode_520_bin等。这些规则可以根据具体需求选择使用。

默认排序规则

当设置表的默认字符集为utf8mb4字符集但未明确指定排序规则时:

  • 在MySQL 5.7版本中,默认排序规则为utf8mb4_general_ci。
  • 在MySQL 8.0版本中,默认排序规则为utf8mb4_0900_ai_ci。

兼容性问题

由于utf8mb4_0900_ai_ci排序规则时MySQL 8.0引入的排序规则,因此将MySQL 8.0版本的表导入到MySQL 5.7或MySQL 5.6版本时,会存在字符集无法识别的问题。

[Err] 1273 - Unknown collation: 'utf8mb4_0900_ai_ci'

解决办法:修改新建数据库的排序规则或手动修改 sql 文件内所有的排序规则。

utf8mb4_unicode_ci和utf8mb4_general_ci对比

  • 准确性:
  • utf8mb4_unicode_ci排序规则基于标准unicode进行排序和比较,能处理特殊的字符,能在各种语音中精确排序。
  • utf8mb4_general_ci排序规则没有基于标准unicode,无法处理部分特殊字符。
  • 性能上:
  • utf8mb4_general_ci排序规则在排序性能上相对较好;
  • utf8mb4_unicode_ci排序规则为处理特殊字符实现复杂的排序算法,性能略差。
  • 在大部分场景下,两者没有明显的性能差异

服务器级别排序参数控制

collation_server

  • 在MySQL 5.6版本中引 collation_server 作为系统变量,用于指定服务器级别的默认字符集校对规则(collation)。
  • 它定义了在创建新表时使用的默认字符集校对规则

查看当前MySQL服务器的collation_server的值:

SHOW VARIABLES LIKE 'collation_server';

该命令将返回一个结果集,其中包含名为collation_server的变量及其对应的值。

注意

  • collation_server是服务器级别的变量,它的值在MySQL服务器启动时设置。
  • 通常在配置文件(如my.cnf或my.ini)中进行配置,重新启动MySQL服务器生效。

默认参数规则

  • 如果服务启动时未指定参数collation_database的值,则默认继承参数collation_server的值。
  • 如果创建数据库时未指定排序规则,则默认使用参数collation_database的值。

注意

  • 参数character_set_database和collation_database在MySQL 5.7版本中被遗弃并将在后续版本中移除。
  • MySQL新增参数default_collation_for_utf8mb4用于控制使用utf8mb4字符集时的默认排序规则,取值为utf8mb4_0900_ai_ci或utf8mb4_general_ci
  • 参数default_collation_for_utf8mb4在下列条件中生效:
  • 使用SHOW COLLATION and SHOW CHARACTER SET 命令时。
  • 在创建库或修改库指定utf8mb4但未指定编码规则时。
  • 在创建表或修改表指定utf8mb4但未指定编码规则时。
  • 在增加列或修改列指定utf8mb4但未指定编码规则时。
  • 其他使用utf8mb4但未指定编码规则时。