排序规则是定义如何比较和排序字符串的一组规则。MySQL 中的每个排序规则都属于一个字符集。每个字符集至少有一个排序规则,大多数有两个或更多排序规则。
排序规则根据权重对字符进行排序。字符集中的每个字符都映射到一个权重。权重相等的字符比较相等,权重不等的字符根据权重的相对大小比较。
该WEIGHT_STRING()
函数可用于查看字符串中字符的权重。
它返回的表示权重的值是一个二进制字符串,因此以可打印的形式显示权重很方便
。下面的示例表明,如果它是一个不区分大小写的非二进制字符串,则
对于字母的大小写权重没有差异
,但如果它是一个二进制字符串,则权重不同:HEX(WEIGHT_STRING(
str
))'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 节,“添加字符集”中的说明。但是,无需添加完整字符集所需的所有信息,只需修改现有字符集的相应文件即可。也就是说,基于字符集当前排序规则已经存在的内容,为新排序规则添加数据结构、函数和配置信息。
如果您修改现有的用户定义排序规则,则可能会影响使用该排序规则的列上的索引的行排序。在这种情况下,重建任何此类索引以避免查询结果不正确等问题。请参阅 第 2.11.13 节,“重建或修复表或索引”。
其他资源
显示如何为全文搜索添加排序规则的示例: 第 12.10.7 节,“为全文索引添加用户定义的排序规则”
Unicode 归类算法 (UCA) 规范: http ://www.unicode.org/reports/tr10/
区域设置数据标记语言 (LDML) 规范: http ://www.unicode.org/reports/tr35/