用户定义的排序规则已弃用;您应预期在 MySQL 的未来版本中删除对它们的的支持。MySQL 9.0 服务器在 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/