10.14 向字符集添加排序规则

归类是定义如何比较和排序字符串的一组规则。 MySQL 中的每个排序规则都属于一个字符集。每个字符集至少具有一个排序规则,大多数字符集具有两个或多个排序规则。

排序规则根据权重对字符排序。字符集中的每个字符都 Map 到权重。权重相等的字符比较相等,权重不相等的字符根据其权重的相对大小进行比较。

WEIGHT_STRING()函数可用于查看字符串中字符的权重。它返回以 table 示重量的值是一个二进制字符串,因此使用HEX(WEIGHT_STRING(str))以可打印形式显示重量很方便。下面的示例显示,如果'AaBb'是非二进制不区分大小写的字符串,则'AaBb'中字母的大小写的权重没有区别,但是如果是二进制字符串,则权重没有区别:

mysql> SELECT HEX(WEIGHT_STRING('AaBb' COLLATE latin1_swedish_ci));
+------------------------------------------------------+
| HEX(WEIGHT_STRING('AaBb' COLLATE latin1_swedish_ci)) |
+------------------------------------------------------+
| 41414242                                             |
+------------------------------------------------------+
mysql> SELECT HEX(WEIGHT_STRING(BINARY 'AaBb'));
+-----------------------------------+
| HEX(WEIGHT_STRING(BINARY 'AaBb')) |
+-----------------------------------+
| 41614262                          |
+-----------------------------------+

MySQL 支持多种排序规则实现,如第 10.14.1 节“排序规则实现类型”中所述。其中一些可以无需重新编译即可添加到 MySQL:

  • 8 位字符集的简单归类。

  • Unicode 字符集的基于 UCA 的排序规则。

  • 二进制(xxx_bin)归类。

以下各节描述如何将前两种类型的排序规则添加到现有字符集。现有的所有字符集已经具有二进制排序规则,因此这里无需描述如何添加一个。

添加新排序规则的过程摘要:

  • 选择排序规则 ID。

  • 添加用于命名排序规则并描述字符排序规则的配置信息。

  • 重新启动服务器。

  • 验证是否存在排序规则。

此处的说明仅涵盖无需重新编译 MySQL 即可添加的排序规则。要添加确实需要重新编译的排序规则(通过 C 源文件中的函数实现),请使用第 10.13 节“添加字符集”中的说明。但是,除了添加完整字符集所需的所有信息之外,只需为现有字符集修改适当的文件即可。也就是说,基于字符集的当前归类已经存在的内容,为新归类添加数据结构,功能和配置信息。

Note

如果您修改现有排序规则,则可能会影响使用该排序规则的列上的索引的行 Sequences。在这种情况下,请重建所有此类索引,以避免出现诸如查询结果不正确的问题。参见第 2.11.12 节,“重建或修复 table 或索引”

Additional Resources