用户定义排序规则已弃用;您应该预期在未来的 MySQL 版本中删除对它们的支持。MySQL 8.4 服务器会针对在 SQL 语句中使用 COLLATE
发出警告;当服务器启动时,如果 user_defined_collation
--collation-server
设置为用户定义排序规则的名称,也会发出警告。
排序规则是一组定义如何比较和排序字符型字符串的规则。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 支持多种排序规则实现,如 第 12.14.1 节“排序规则实现类型” 中所述。其中一些可以在不重新编译的情况下添加到 MySQL 中
针对 8 位字符集的简单排序规则。
针对 Unicode 字符集的基于 UCA 的排序规则。
二进制 (
) 排序规则。xxx
_bin
以下部分描述了如何将前两种类型的用户定义排序规则添加到现有字符集中。所有现有字符集都已有一个二进制排序规则,因此这里无需描述如何添加二进制排序规则。
不支持重新定义内置排序规则,并且可能会导致服务器行为意外。
添加新的用户定义排序规则的步骤概要
选择排序规则 ID。
添加命名排序规则并描述字符排序规则的配置信息。
重新启动服务器。
验证服务器是否识别排序规则。
这里介绍的说明仅涵盖可以在不重新编译 MySQL 的情况下添加的用户定义排序规则。要添加需要重新编译的排序规则(如通过 C 源文件中的函数实现的排序规则),请使用 第 12.13 节“添加字符集” 中的说明。但是,您无需添加完整的字符集所需的所有信息,只需修改现有字符集的相应文件即可。也就是说,根据现有字符集的当前排序规则中的内容,添加用于新排序规则的数据结构、函数和配置信息。
如果您修改了现有的用户定义排序规则,则可能会影响使用该排序规则的列索引的行的排序。在这种情况下,请重建所有此类索引,以避免出现错误的查询结果等问题。请参阅 第 3.14 节“重建或修复表或索引”。
其他资源
显示如何为全文搜索添加排序规则的示例:第 14.9.7 节“为全文索引添加用户定义排序规则”
Unicode 排序算法 (UCA) 规范:http://www.unicode.org/reports/tr10/
区域设置数据标记语言 (LDML) 规范:http://www.unicode.org/reports/tr35/