本节描述 MySQL 识别的 LDML 语法。这是在 http://www.unicode.org/reports/tr35/ 上提供的 LDML 规范中描述的语法的子集,应参考该规范以获取更多信息。MySQL 识别足够大的语法子集,因此在许多情况下,可以从 Unicode 通用区域设置数据存储库下载排序规则定义并将相关部分(即 <rules> 和 </rules> 标签之间的部分)粘贴到 MySQL Index.xml 文件中。这里描述的规则都支持,但字符排序仅在主级别发生。指定二级或更高排序级别差异的规则将被识别(因此可以包含在排序规则定义中),但在主级别被视为相等。
当 MySQL 服务器在解析 Index.xml 文件时发现问题时,它会生成诊断信息。请参见 第 12.14.4.3 节,“Index.xml 解析期间的诊断”。
字符表示
LDML 规则中命名的字符可以用文字或 \u 格式编写,其中 nnnnnnnn 是十六进制 Unicode 代码点值。例如,A 和 á 可以用文字或 \u0041 和 \u00E1 编写。在十六进制值内,数字 A 到 F 不区分大小写;\u00E1 和 \u00e1 是等效的。对于 UCA 4.0.0 排序规则,十六进制符号只能用于基本多语言平面中的字符,不能用于 BMP 范围 0000 到 FFFF 之外的字符。对于 UCA 5.2.0 排序规则,十六进制符号可以用于任何字符。
Index.xml 文件本身应使用 UTF-8 编码编写。
语法规则
LDML 有重置规则和移位规则来指定字符顺序。排序作为一组规则给出,这些规则从一个重置规则开始,该规则建立一个锚点,然后是一些移位规则,这些规则指示字符相对于锚点的排序方式。
<reset>规则本身不指定任何排序。相反,它 “重置” 随后移位规则的排序,使其相对于给定字符进行。以下两种规则之一将后续移位规则重置为相对于字母'A'进行<reset>A</reset> <reset>\u0041</reset><p>、<s>和<t>移位规则定义了字符相对于另一个字符的主、次和三级差异使用主差异来区分不同的字母。
使用次差异来区分重音变化。
使用三级差异来区分字母大小写变化。
以下两种规则之一为
'G'字符指定主移位规则<p>G</p> <p>\u0047</p><i>移位规则表示一个字符的排序与另一个字符相同。以下规则使'b'的排序与'a'相同<reset>a</reset> <i>b</i>缩写移位语法使用一对标签来指定多个移位规则。下表显示了缩写语法规则与等效的非缩写规则之间的对应关系。
表 12.5 缩写移位语法
缩写语法 非缩写语法 <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'的序列在主级别上设置高于三个字符'abc'的序列<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 规范将普通扩展语法描述为 “棘手的”。请参见该规范以获取详细信息。
先前上下文语法使用
<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属性。通常,重置规则之后的移位规则指示排序在重置字符之后的字符。重置规则之后的移位规则,如果具有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">重置规则可以命名一个逻辑重置位置,而不是一个文字字符
<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/>这些规则将
'z'在主级别上设置高于具有默认 Unicode 排序元素表 (DUCET) 条目且不是 CJK 的不可忽略字符<reset><last_non_ignorable/></reset> <p>z</p>逻辑位置的代码点如下表所示。
表 12.6 逻辑重置位置代码点
逻辑位置 Unicode 4.0.0 代码点 Unicode 5.2.0 代码点 <first_non_ignorable/>U+02D0 U+02D0 <last_non_ignorable/>U+A48C U+1342E <first_primary_ignorable/>U+0332 U+0332 <last_primary_ignorable/>U+20EA U+101FD <first_secondary_ignorable/>U+0000 U+0000 <last_secondary_ignorable/>U+FE73 U+FE73 <first_tertiary_ignorable/>U+0000 U+0000 <last_tertiary_ignorable/>U+FE73 U+FE73 <first_trailing/>U+0000 U+0000 <last_trailing/>U+0000 U+0000 <first_variable/>U+0009 U+0009 <last_variable/>U+2183 U+1D371 The
<collation>元素允许一个shift-after-method属性,它影响移位规则的字符权重计算。该属性有以下允许的值simple: 计算字符权重,就像没有before属性的重置规则一样。如果未给出该属性,则为默认值。expand: 在重置规则之后使用扩展进行移位。
假设
'0'和'1'的权重分别为0E29和0E2A,我们想要将所有基本拉丁字母放在'0'和'1'之间<reset>0</reset> <pc>abcdefghijklmnopqrstuvwxyz</pc>对于简单移位模式,权重按如下方式计算
'a' has weight 0E29+1 'b' has weight 0E29+2 'c' has weight 0E29+3 ...但是,没有足够的空位来将 26 个字符放在
'0'和'1'之间。结果是数字和字母混合在一起。为了解决这个问题,使用
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 类似,但使用3ACA,对应于字符0x1342E。
MySQL 特定 LDML 扩展
LDML 规则的扩展允许 <collation> 元素在 <collation> 标签中包含一个可选的 version 属性,以指示排序规则所基于的 UCA 版本。如果省略了 version 属性,其默认值为 4.0.0。例如,此规范指示一个基于 UCA 5.2.0 的排序规则
<collation id="nnn" name="utf8mb4_xxx_ci" version="5.2.0">
...
</collation>