# 10.14 向字符集添加排序规则

10.14.1 排序规则实现类型

10.14.2 选择归类 ID

10.14.3 向 8 位字符集添加简单排序规则

10.14.4 将 UCA 归类添加到 Unicode 字符集

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

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

重量字符串()函数可用于查看字符串中字符的权重。它返回的表示权重的值是二进制字符串,使用起来很方便十六进制(WEIGHT_STRING(*字符串*))以可打印的形式显示重量。下面的示例显示,对于'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) 排序规则。

    以下部分描述了如何将前两种类型的用户定义排序规则添加到现有字符集。所有现有的字符集都已经有一个二进制排序规则,所以这里不需要描述如何添加一个。

警告

不支持重新定义内置排序规则,这可能会导致意外的服务器行为。

添加新的用户定义的排序规则的过程摘要:

  1. 选择一个排序规则 ID。

  2. 添加命名排序规则并描述字符排序规则的配置信息。

  3. 重新启动服务器。

  4. 验证服务器是否识别排序规则。

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

笔记

如果您修改现有的用户定义的排序规则,这可能会影响使用该排序规则的列上索引的行顺序。在这种情况下,请重建任何此类索引,以避免查询结果不正确等问题。看第 2.11.13 节,“重建或修复表或索引”.

# 其他资源