# 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 范围之外的字符0000FFFF.对于 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'有分量0E290E2A我们想把所有基本的拉丁字母放在'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]
    ...
    

    233DUCA 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>