排序规则

排序规则主要影响字符串属性的比较。它们定义了字符集编码以及 Manticore 在执行涉及字符串属性的 ORDER BYGROUP BY 时用于比较字符串的策略。

字符串属性在索引过程中按原样存储,并且不附带字符集或语言信息。只要 Manticore 仅需将字符串逐字存储和返回给调用应用程序,这种方式是可以的。然而,当您要求 Manticore 按字符串值排序时,请求立即变得模糊。

首先,单字节(ASCII、ISO-8859-1 或 Windows-1251)字符串需要与可能用可变字节数编码每个字符的 UTF-8 字符串不同地处理。因此,我们需要知道字符集类型,以便正确地将原始字节解释为有意义的字符。

其次,我们还需要了解语言特定的字符串排序规则。例如,在 en_US 地区设置的美国规则下排序时,带变音符号的字符 ï(带变音符号的小写字母 i)应放在 z 之后的某个位置。但在考虑法语规则和 fr_FR 地区设置时,它应放在 ij 之间。其他规则可能完全忽略重音符号,使得 ïi 可以任意混合。

第三,在某些情况下,我们可能需要区分大小写的排序,而在其他情况下,则需要不区分大小写的排序。

排序规则封装了以下所有内容:字符集、语言规则以及大小写敏感性。Manticore 当前提供四种排序规则:

  1. libc_ci
  2. libc_cs
  3. utf8_general_ci
  4. binary

前两种排序规则依赖于几个标准 C 库(libc)调用,因此可以支持系统上安装的任何地区设置。它们分别提供不区分大小写(_ci)和区分大小写(_cs)的比较。默认情况下,它们使用 C 地区设置,实际上退化为逐字节比较。若要更改此设置,需要使用 collation_libc_locale 指令指定其他可用地区设置。系统上可用的地区设置列表通常可通过 locale 命令获得:

$ locale -a
C
en_AG
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IN
en_NG
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US.utf8
en_ZA.utf8
en_ZW.utf8
es_ES
fr_FR
POSIX
ru_RU.utf8
ru_UA.utf8

系统地区设置的具体列表可能有所不同。请查阅操作系统文档以安装所需的额外地区设置。

utf8_general_cibinary 地区设置内置于 Manticore 中。第一种是 UTF-8 数据的通用排序规则(无所谓的语言定制),其行为应类似于 MySQL 中的 utf8_general_ci 排序规则。第二种则是简单的逐字节比较。

排序规则可以通过 SQL 语句 SET collation_connection 按会话覆盖。所有后续 SQL 查询将使用该排序规则。否则,所有查询将使用服务器默认排序规则或 collation_server 配置指令中指定的排序规则。Manticore 当前默认使用 libc_ci 排序规则。

排序规则影响所有字符串属性的比较,包括 ORDER BYGROUP BY 中的比较,因此根据选择的排序规则,返回的结果顺序或分组可能不同。请注意,排序规则不影响全文搜索;对此,请使用 charset_table

Last modified: August 28, 2025