10.14.4.2 MySQL 支持的 LDML 语法

本节介绍了 MySQL 可以识别的 LDML 语法。这是http://www.unicode.org/reports/tr35/处的 LDML 规范中描述的语法的子集,有关更多信息,请查阅该语法。 MySQL 可以识别语法的足够大的子集,在许多情况下,可以从 Unicode Common Locale Data Repository 下载排序规则定义并将相关部分(即<rules></rules>标记之间的部分)粘贴到 MySQL Index.xml文件。除了字符排序仅在主级别上进行之外,所有此处描述的规则均受支持。可以识别在次级或更高排序级别指定差异的规则(因此可以包含在归类定义中),但在主级别被视为相等。

MySQL 服务器在解析Index.xml文件时发现问题时,将生成诊断信息。参见第 10.14.4.3 节“ Index.xml 解析期间的诊断”

Character Representation

LDML 规则中命名的字符可以按原义或\unnnn格式编写,其中* nnnn *是十六进制 Unicode 代码点值。例如,Aá可以原义写成,也可以写成\u0041\u00E1。在十六进制值内,数字AF不区分大小写; \u00E1\u00e1是等效的。对于 UCA 4.0.0 归类,十六进制符号只能用于基本多语言平面中的字符,不能用于0000FFFF的 BMP 范围之外的字符。对于 UCA 5.2.0 归类,十六进制符号可用于任何字符。

Index.xml文件本身应使用 UTF-8 编码编写。

Syntax Rules

LDML 具有重置规则和移位规则以指定字符 Sequences。Sequences 是作为一组规则给出的,这些规则以构建锚点的重置规则开头,后跟指示字符相对于锚点的排序方式的移位规则。

  • <reset>规则本身未指定任何 Sequences。相反,它“重置”了后续移位规则的 Sequences,以使它们相对于给定字符采用。以下规则中的任何一个都会重置要针对字母'A'采取的后续移位规则:
<reset>A</reset>

<reset>\u0041</reset>
  • <p><s><t>移位规则定义一个字符与另一个字符的主要,次要和三次差异:

  • 使用主要差异来区分单独的字母。

    • 使用次要差异来区分重音变化。

    • 使用三次差异来区分字母大小写。

这些规则中的任何一个都指定'G'字符的主要移位规则:

<p>G</p>

<p>\u0047</p>
  • <i>移位规则 table 示一个字符与另一个字符排序相同。以下规则使'b''a'排序相同:
<reset>a</reset>
<i>b</i>
  • 缩写移位语法使用一对标签指定多个移位规则。下 table 显示了缩写语法规则和等效的非缩写规则之间的对应关系。

table10.5 缩写移位语法

Abbreviated SyntaxNonabbreviated Syntax
<pc>xyz</pc><p>x</p><p>y</p><p>z</p>
<sc>xyz</sc><s>x</s><s>y</s><s>z</s>
<tc>xyz</tc><t>x</t><t>y</t><t>z</t>
<ic>xyz</ic><i>x</i><i>y</i><i>z</i>
  • 扩展是一种重置规则,可为多字符序列构建定位点。 MySQL 支持扩展 2 到 6 个字符。以下规则在主要级别上将'z'设置为大于三个字符'abc'的序列:
<reset>abc</reset>
<p>z</p>
  • 收缩是对多字符序列进行排序的移位规则。 MySQL 支持 2 至 6 个字符长的收缩。以下规则将三个字符'xyz'的序列在主要级别上比'a'大:
<reset>a</reset>
<p>xyz</p>
  • 长膨胀和长收缩可以一起使用。这些规则在主要级别上将三个字符'xyz'的 Sequences 设置为比三个字符'abc'的 Sequences 大:
<reset>abc</reset>
<p>xyz</p>
  • 普通扩展语法使用<x><extend>元素来指定扩展。以下规则将字符'k'在辅助级别上比序列'ch'大。也就是说,'k'的行为就像是在'c'之后跟着'h'扩展为一个字符一样:
<reset>c</reset>
<x><s>k</s><extend>h</extend></x>

此语法允许长序列。这些规则在第三级对序列'ccs'的排序比对序列'cscs'的排序大:

<reset>cs</reset>
<x><t>ccs</t><extend>cs</extend></x>

LDML 规范将正常的扩展语法描述为“ tricky”。有关详细信息,请参见该规范。

  • 先前的上下文语法使用<x><context>元素来指定字符之前的上下文会影响其排序方式。以下规则将'-'设置为比'a'大,但仅在'-'出现在'b'之后时:
<reset>a</reset>
<x><context>b</context><s>-</s></x>
  • 先前的上下文语法可以包含<extend>元素。这些规则在主要级别将'def'设置为大于'aghi',但仅当'def''abc'之后:
<reset>a</reset>
<x><context>abc</context><p>def</p><extend>ghi</extend></x>
  • 重置规则允许before属性。通常,重设规则之后的移位规则 table 示在重设字符之后排序的字符。具有before属性的重置规则之后的移位规则指示在重置字符之前排序的字符。以下规则在主要级别将字符'b'紧接在'a'之前:
<reset before="primary">a</reset>
<p>b</p>

允许的before属性值按名称或等效的数值指定排序级别:

<reset before="primary">
<reset before="1">

<reset before="secondary">
<reset before="2">

<reset before="tertiary">
<reset before="3">
  • 重置规则可以命名逻辑重置位置,而不是 Literals 字符:
<first_tertiary_ignorable/>
<last_tertiary_ignorable/>
<first_secondary_ignorable/>
<last_secondary_ignorable/>
<first_primary_ignorable/>
<last_primary_ignorable/>
<first_variable/>
<last_variable/>
<first_non_ignorable/>
<last_non_ignorable/>
<first_trailing/>
<last_trailing/>

与具有默认 Unicode 排序规则元素 table(DUCET)条目且不是 CJK 的不可忽略字符相比,这些规则在主要级别上将'z'设置为更大:

<reset><last_non_ignorable/></reset>
<p>z</p>

逻辑位置具有下 table 中显示的代码点。

table10.6 逻辑复位位置代码点

Logical PositionUnicode 4.0.0 代码点Unicode 5.2.0 代码点
<first_non_ignorable/>U+02D0U+02D0
<last_non_ignorable/>U+A48CU+1342E
<first_primary_ignorable/>U+0332U+0332
<last_primary_ignorable/>U+20EAU+101FD
<first_secondary_ignorable/>U+0000U+0000
<last_secondary_ignorable/>U+FE73U+FE73
<first_tertiary_ignorable/>U+0000U+0000
<last_tertiary_ignorable/>U+FE73U+FE73
<first_trailing/>U+0000U+0000
<last_trailing/>U+0000U+0000
<first_variable/>U+0009U+0009
<last_variable/>U+2183U+1D371
  • <collation>元素允许使用shift-after-method属性,该属性会影响移位规则的字符权重计算。该属性具有以下允许值:

  • simple:根据没有before属性的重置规则计算字符权重。如果未提供该属性,则为默认设置。

    • expand:对重置规则后的班次使用 extensions。

假设'0''1'的权重分别为0E290E2A,我们希望将所有基本拉丁字母放在'0''1'之间:

<reset>0</reset>
<pc>abcdefghijklmnopqrstuvwxyz</pc>

对于简单换档模式,权重计算如下:

'a' has weight 0E29+1
'b' has weight 0E29+2
'c' has weight 0E29+3
...

但是,没有足够的空缺位置来在'0''1'之间放置 26 个字符。结果是数字和字母混合在一起。

要解决此问题,请使用shift-after-method="expand"。然后按以下方式计算权重:

'a' has weight [0E29][233D+1]
'b' has weight [0E29][233D+2]
'c' has weight [0E29][233D+3]
...

233D是字符0xA48C的 UCA 4.0.0 权重,后者是最后一个不可忽略的字符(排序规则中一种最大的字符,不包括 CJK)。 UCA 5.2.0 与之类似,但对字符0x1342E使用3ACA

特定于 MySQL 的 LDML 扩展

LDML 规则的扩展允许<collation>元素在<collation>标签中包含可选的version属性,以指示排序规则所基于的 UCA 版本。如果省略version属性,则其默认值为4.0.0。例如,此规范指示基于 UCA 5.2.0 的归类:

<collation id="nnn" name="utf8_xxx_ci" version="5.2.0">
...
</collation>