本节描述 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
格式编写,其中 nnnn
nnnn
是十六进制 Unicode 代码点值。例如,A
和 á
可以用字面量或 \u0041
和 \u00E1
编写。在十六进制值中,数字 A
到 F
不区分大小写;\u00E1
和 \u00e1
等效。对于 UCA 4.0.0 排序规则,十六进制表示法只能用于基本多语言平面中的字符,不能用于 0000
到 FFFF
的 BMP 范围之外的字符。对于 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 <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 ...
但是,在
'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 类似,但使用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>