用户定义的排序规则已被弃用;您应该预期在未来版本的MySQL中删除对其的支持。MySQL 8.3服务器会针对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 节“重建或修复表或索引”。
Additional Resources
-
显示如何为全文搜索添加排序规则的示例:第 14.9.7 节“为全文索引添加用户定义排序规则”
-
Unicode 排序规则算法 (UCA) 规范:http://www.unicode.org/reports/tr10/
-
区域设置数据标记语言 (LDML) 规范:http://www.unicode.org/reports/tr35/