# 10.14.4.2 MySQL 支持的 LDML 语法
本节描述 MySQL 识别的 LDML 语法。这是 LDML 规范中描述的语法的子集,可在http://www.unicode.org/reports/tr35/ (opens new window), 应咨询以获取更多信息。MySQL 可以识别足够大的语法子集,在许多情况下,可以从 Unicode Common Locale Data Repository 下载排序规则定义并粘贴相关部分(即,<规则>
和</规则>
标签)进入MySQL索引.xml
文件。此处描述的规则都受支持,除了字符排序仅发生在初级级别。在二级或更高排序级别指定差异的规则被识别(因此可以包含在排序规则定义中),但在主要级别被视为相等。
MySQL 服务器在解析数据时发现问题时生成诊断索引.xml
文件。看第 10.14.4.3 节,“Index.xml 解析期间的诊断”.
字符表示
以 LDML 规则命名的字符可以按字面书写,也可以用\u*
呸呸呸*
格式,在哪里*呸呸呸
*是十六进制 Unicode 码位值。例如,一种
和一种
可以直接写成\u0041
和\u00E1
.在十六进制值内,数字一种
通过F
不区分大小写;\u00E1
和\u00e1
是等价的。对于 UCA 4.0.0 排序规则,十六进制表示法只能用于基本多语言平面中的字符,不能用于 BMP 范围之外的字符0000
到FFFF
.对于 UCA 5.2.0 排序规则,十六进制表示法可用于任何字符。
这索引.xml
文件本身应使用 UTF-8 编码编写。
语法规则
LDML 具有重置规则和移位规则来指定字符顺序。排序以一组规则的形式给出,以建立锚点的重置规则开始,然后是指示字符如何相对于锚点排序的移位规则。
一种
<重置>
规则本身并没有指定任何排序。相反,它“重置”了后续班次规则的顺序,以使它们与给定字符相关联。以下任何一条规则都会重置与该字母相关的后续班次规则'一种'
:<reset>A</reset> <reset>\u0041</reset>
这
<p>
,<s>
, 和<t>
移位规则定义了一个字符与另一个字符的主要、次要和三次差异:使用主要差异来区分不同的字母。
使用次要差异来区分口音变化。
使用三级差异来区分字母大小写变化。
这些规则中的任何一个都为
'G'
特点:
<p>G</p> <p>\u0047</p>
这
<i>
移位规则表示一个字符与另一个字符的排序相同。以下规则导致'b'
排序相同'一种'
:<reset>a</reset> <i>b</i>
缩写移位语法使用一对标签指定多个移位规则。下表显示了缩写语法规则和等效的非缩写规则之间的对应关系。
表 10.5 缩写 Shift 语法
缩写语法 非缩写语法 <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'
在小学阶段大于'一种'
:<reset>a</reset> <p>xyz</p>
长扩展和长收缩可以一起使用。这些规则把三个字符的顺序
'xyz'
在初级水平上大于三个字符的序列'abc'
:<reset>abc</reset> <p>xyz</p>
正常扩展语法使用
<x>
加<扩展>
指定扩展的元素。以下规则将字符'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”
在初级阶段比“阿吉”
,但只有当“def”
紧随其后“abc”
:<reset>a</reset> <x><context>abc</context><p>def</p><extend>ghi</extend></x>
重置规则允许
之前
属性通常,重置规则后的移位规则指示在重置字符后排序的字符。重置规则后的移位规则具有之前
属性指示在重置字符之前排序的字符。下面的规则将角色“b”
就在之前“a”
在小学一级:<reset before="primary">a</reset> <p>b</p>
允许的
之前
属性值按名称或等效数值指定排序级别:<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>
逻辑位置的代码点如下表所示。
表10.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_Treative_ignorable/>
U+0000 U+0000 <last_treative_ignorable/>
U+FE73 U+FE73 <first_training/>
U+0000 U+0000 <last_training/>
U+0000 U+0000 <first_variable/>
U+0009 U+0009 <last_variable/>
U+2183 U+1D371 这个
<collation>
元素允许后移法
属性,该属性影响shift规则的角色权重计算。该属性具有以下允许值:易于理解的
:计算不包含字符的重置规则的字符权重之前
属性如果未给出属性,则这是默认值。扩大
:重置规则后,对轮班使用扩展。假设
'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'
.结果是数字和字母混合在一起。要解决这个问题,请使用
在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的LDML扩展
LDML规则的扩展允许<collation>
元素以包含可选的版本
归因于<collation>
标记以指示排序规则所基于的UCA版本。如果版本
属性,其默认值为4.0.0
。例如,本规范表示基于UCA 5.2.0的排序规则:
<collation id="nnn" name="utf8_xxx_ci" version="5.2.0">
...
</collation>