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
。在十六进制值内,数字A
至F
不区分大小写; \u00E1
和\u00e1
是等效的。对于 UCA 4.0.0 归类,十六进制符号只能用于基本多语言平面中的字符,不能用于0000
到FFFF
的 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 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'
的 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 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 |
-
<collation>
元素允许使用shift-after-method
属性,该属性会影响移位规则的字符权重计算。该属性具有以下允许值: -
simple
:根据没有before
属性的重置规则计算字符权重。如果未提供该属性,则为默认设置。expand
:对重置规则后的班次使用 extensions。
假设'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 与之类似,但对字符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>