MySQL 8.0 参考手册  / 第 10 章字符集、排序规则、Unicode  /  10.14 向字符集添加归类

10.14 向字符集添加归类

排序规则是定义如何比较和排序字符串的一组规则。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) 归类。

以下部分描述了如何将前两种类型的用户定义排序规则添加到现有字符集中。所有现有的字符集都已经有了二进制排序规则,所以这里不需要描述如何添加一个。

添加新的用户定义归类的过程摘要:

  1. 选择归类 ID。

  2. 添加命名排序规则并描述字符排序规则的配置信息。

  3. 重新启动服务器。

  4. 验证服务器是否识别排序规则。

此处的说明仅涵盖无需重新编译 MySQL 即可添加的用户定义的排序规则。要添加确实需要重新编译的排序规则(通过 C 源文件中的函数实现),请使用 第 10.13 节,“添加字符集”中的说明。但是,无需添加完整字符集所需的所有信息,只需修改现有字符集的相应文件即可。也就是说,基于字符集当前排序规则已经存在的内容,为新排序规则添加数据结构、函数和配置信息。

笔记

If you modify an existing user-defined collation, that may affect the ordering of rows for indexes on columns that use the collation. In this case, rebuild any such indexes to avoid problems such as incorrect query results. See Section 2.11.12, “Rebuilding or Repairing Tables or Indexes”.

Additional Resources