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>A</reset>

<reset>\u0041</reset>

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

<p>G</p>

<p>\u0047</p>
<reset>a</reset>
<i>b</i>

table10.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>
<reset>abc</reset>
<p>z</p>
<reset>a</reset>
<p>xyz</p>
<reset>abc</reset>
<p>xyz</p>
<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”。有关详细信息,请参见该规范。

<reset>a</reset>
<x><context>b</context><s>-</s></x>
<reset>a</reset>
<x><context>abc</context><p>def</p><extend>ghi</extend></x>
<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/>

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

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

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

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

Logical Position 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

假设'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>
首页