本节描述了 MySQL 认可的 LDML 语法。这是 LDML 规范中描述的语法的一个子集,详见 http://www.unicode.org/reports/tr35/,该规范应被咨询以获取更多信息。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
。对于 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 缩写移位语法
Abbreviated Syntax Nonabbreviated 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'
排序在主要级别高于三个字符序列'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规范将普通扩展语法描述为 “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
属性。 通常,重置规则后的shift规则指示字符排序在重置字符之后。 shift规则后的重置规则具有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 逻辑重置位置代码点
Logical Position Unicode 4.0.0 Code Point Unicode 5.2.0 Code Point <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
属性,该属性影响shift规则的字符权重计算。 属性具有以下允许值:-
simple
:计算字符权重,如同reset规则没有before
属性一样。 这是默认值,如果属性未给出。 -
expand
:使用扩展来shift规则后的reset规则。
假设
'0'
和'1'
具有权重0E29
和0E2A
,我们想将所有基本拉丁字母放在'0'
和'1'
之间:<reset>0</reset> <pc>abcdefghijklmnopqrstuvwxyz</pc>
对于简单shift模式,权重计算如下:
'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
是UCA 4.0.0 中字符0xA48C
的权重,最后一个不可忽略的字符(排序表中的最后一个字符,排除CJK)。 UCA 5.2.0 类似,但使用3ACA
,对应字符0x1342E
。 -
MySQL-Specific LDML 扩展
LDML 规则的扩展允许 <collation>
元素包括可选的 version
属性,以指示排序基于哪个 UCA 版本。 如果省略 version
属性,其默认值为 4.0.0
。 例如,该规范指示基于 UCA 5.2.0 的排序:
<collation id="nnn" name="utf8mb4_xxx_ci" version="5.2.0">
...
</collation>