10.14 为字符集添加排序规则

  • 10.14.1 整理实现类型

  • 10.14.2 选择整理 ID

  • 10.14.3 将简单排序规则添加到 8-Bit 字符集

  • 10.14.4 将 UCA 排序规则添加到 Unicode 字符集

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

整理根据权重对字符进行排序。字符集中的每个字符 maps 到一个权重。具有相等权重的字符比较相等,并且具有不等权重的字符根据其权重的相对大小进行比较。

WEIGHTSTRING() function 可用于查看 string 中字符的权重。它返回的 value 表示权重是二进制 string,因此使用HEX(WEIGHT_STRING(str))以可打印的形式显示权重是很方便的。以下 example 显示'AaBb'中字母的字母大小的权重不同,如果它是非二进制 case-insensitive string,但如果它是二进制 string 则不同:

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 支持几种排序规则 implementation,如第 10.14.1 节,“整理实现类型”中所述。其中一些可以添加到 MySQL 而无需重新编译:

  • 8-bit 字符 sets 的简单排序规则。

  • UCA-based Unicode 字符集的排序规则。

  • 二进制(xxx_bin)排序规则。

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

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

  • 选择排序规则 ID。

  • 添加命名归类的 configuration 信息并描述 character-ordering 规则。

  • 重启服务器。

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

这里的说明仅涵盖可以在不重新编译 MySQL 的情况下添加的排序规则。要添加需要重新编译的排序规则(通过 C 源文件中的函数实现),请使用第 10.13 节,“添加字符集”中的说明。但是,只需修改现有字符集的相应 files,而不是添加完整字符集所需的所有信息。也就是说,根据字符集当前排序规则已经存在的内容,为新排序规则添加数据结构,函数和 configuration 信息。

注意
如果修改现有排序规则,则可能会影响使用排序规则的列上索引的行的排序。在这种情况下,重建任何此类索引以避免诸如不正确的查询结果之类的问题。见第 2.11.12 节,“重建或修复表或索引”。

其他资源

  • Unicode 归类算法(UCA)规范:http://www.unicode.org/reports/tr10/

  • Locale 数据标记语言(LDML)规范:http://www.unicode.org/reports/tr35/