12.14 添加排序规则到字符集
用户定义的排序规则已弃用,未来版本可能会删除对它们的支持。MySQL 8.4 服务器在 SQL 语句中使用 COLLATE
时发出警告;同样,在服务器启动时设置--collation-server
等于用户定义的排序规则名称时也会发出警告。
排序规则是比较和排序字符字符串的一组规则。每个排序规则在 MySQL 中都属于一个字符集。每个字符集至少有一个排序规则,多数有两个或更多排序规则。
基于权重的排序(collation):每个字符在字符集中对应一个权重。权重相等的字符比较为等价,权重不等的字符比较根据其权重的大小关系。
可以使用WEIGHT_STRING()
函数来查看字符串中的权重。返回值是一个二进制字符串,所以可以使用HEX(WEIGHT_STRING(
将权重以可读形式显示。下面的示例表明,如果是非二进制的大小写不敏感字符串,那么字母的权重相同,但如果是二进制字符串,那么权重不同:str
))
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支持多种collation实现方式,详见Section 12.14.1, “Collation Implementation Types”。其中一些可以在不重新编译MySQL的情况下添加:
-
8位字符集的简单collation。
-
基于UCA的Unicode字符集collation。
-
二进制(
) collation。xxx
_bin
以下部分描述了如何将用户定义的简单或基于UCA的collation添加到现有字符集中。所有现有字符集已经具有二进制collation,所以不需要在这里描述如何添加一个。
重新定义内置collation不受支持可能导致服务器行为异常。
添加新用户定义collation的总结步骤:
-
选择collation ID。
-
添加字符集配置信息,包括排序规则的描述和collation名称。
-
重启服务器。
-
验证服务器是否识别了新的字符集。
本节中的指令只涵盖用户定义的字符集,可以在不需要重新编译MySQL的情况下添加。要添加需要重新编译的字符集(即通过C源文件中的函数实现),请参阅第12.13节,“添加字符集”。然而,在基于现有字符集的当前排序规则基础上,添加数据结构、函数和配置信息,以便创建新的排序规则。这意味着,您可以基于现有字符集的当前排序规则,添加对应的数据结构、函数和配置信息以创建新的排序规则。
如果您修改了现有的用户定义的排序规则,那么可能会影响使用该排序规则的列上的索引行顺序。在这种情况下,重建任何受影响的索引,以避免问题,如查询结果错误。请参阅第3.14节,“重建或修复表或索引”。
-
示例:添加全文搜索排序规则第14.9.7节,“添加用户定义的排序规则用于全文索引”
-
Unicode 排序算法(UCA)规范:http://www.unicode.org/reports/tr10/
-
Locale Data Markup Language(LDML)规范:http://www.unicode.org/reports/tr35/