Documentation Home

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文件。此处描述的规则均受支持,但字符排序仅发生在初级级别。在次级或更高排序级别指定差异的规则被识别(因此可以包含在归类定义中)但在初级级别被视为相等。

Index.xmlMySQL 服务器在解析文件 时发现问题时会生成诊断信息。请参阅 第 10.14.4.3 节,“Index.xml 解析期间的诊断”

字符表示

LDML 规则中命名的字符可以按字面或 格式书写,其中是十六进制的 Unicode 代码点值。例如, and可以按字面意思写成 and 。在十六进制值中, 通过的数字不区分大小写; 并且是等价的。对于 UCA 4.0.0 归类,十六进制表示法只能用于 Basic Multilingual Plane 中的字符,不能用于 BMP 到 范围之外的 字符。对于 UCA 5.2.0 归类,十六进制表示法可用于任何字符。 \unnnnnnnnAá\u0041\u00E1AF\u00E1\u00e10000FFFF

Index.xml文件本身应使用 UTF-8 编码编写 。

语法规则

LDML 有重置规则和移位规则来指定字符顺序。顺序以一组规则的形式给出,这些规则以建立锚点的重置规则开始,然后是指示字符如何相对于锚点排序的移位规则。

  • <reset>规则本身不指定任何顺序 。相反,它 重置后续转换规则的顺序,使它们与给定字符相关。以下任一规则都会重置与字母相关的后续轮班规则 'A'

    <reset>A</reset>
    
    <reset>\u0041</reset>
  • <p>和 shift 规则定义了一个字符与另一个字符的主要、次要和第三次区别 <s><t>

    • 使用主要差异来区分不同的字母。

    • 使用次要差异来区分重音变体。

    • 使用三级差异来区分字母大小写变化。

    这些规则中的任何一个都指定了'G'角色的主要轮班规则:

    <p>G</p>
    
    <p>\u0047</p>
  • <i>移位规则表示一个字符与另一个字符 的排序相同。以下规则导致'b'排序与 相同 'a'

    <reset>a</reset>
    <i>b</i>
  • 缩写的移位语法使用一对标记指定多个移位规则。下表显示了缩写语法规则和等效的非缩写规则之间的对应关系。

    表 10.5 缩写的移位语法

    缩写语法 非缩写语法
    <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 规范将正常的扩展语法描述为棘手的。详情请参阅该规范。

  • 以前的上下文语法使用<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属性。通常,重置规则之后的移位规则指示在重置字符之后排序的字符。具有属性的重置规则之后的移位规则 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>

    逻辑位置具有下表所示的代码点。

    表 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_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:在重置规则后对轮班使用扩展。

    假设'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'。结果是数字和字母混合在一起。

    要解决此问题,请使用 shift-after-method="expand". 然后权重计算如下:

    'a' has weight [0E29][233D+1]
    'b' has weight [0E29][233D+2]
    'c' has weight [0E29][233D+3]
    ...

    233D是 character 的 UCA 4.0.0 权重0xA48C,它是最后一个不可忽略的字符(一种归类中最大的字符,不包括 CJK)。UCA 5.2.0 类似但使用3ACA, for character 0x1342E

MySQL 特定的 LDML 扩展

LDML 规则的扩展允许 <collation>元素在标记中包含一个可选version属性, <collation>以指示归类所基于的 UCA 版本。如果 version省略该属性,则其默认值为4.0.0。例如,此规范指示基于 UCA 5.2.0 的归类:

<collation id="nnn" name="utf8_xxx_ci" version="5.2.0">
...
</collation>