Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


12.14.4.2 MySQL 支持的 LDML 语法

本节描述了 MySQL 认识的 LDML 语法。这是 LDML 规范中描述的一部分,详细信息请参阅 http://www.unicode.org/reports/tr35/。MySQL 认识了 LDML 语法的子集,在许多情况下,可以从 Unicode 通用地区数据仓库下载排序定义,然后将相关部分(即在<rules></rules>标签之间的部分)粘贴到 MySQL 的Index.xml文件中。这里描述的规则都被支持,except 字符排序只发生在 primary level。指定 secondary 或更高级别差异的规则被识别(因此可以包含在排序定义中),但在 primary level 中被视为等同。

MySQL 服务器在解析Index.xml文件时生成诊断信息。请参阅第12.14.4.3节,“Diagnostics During Index.xml Parsing”

字符表示

LDML 规则中命名的字符可以使用字面形式或在 \unnnn 格式中写入,其中 nnnn 是十六进制 Unicode 字符点值。例如,Aá 可以使用字面形式或作为 \u0041\u00E1 写入。在十六进制值中,数字 AF 不区分大小写;\u00E1\u00e1 等价。对于 UCA 4.0.0 排序规则,十六进制表示只能用于基本多语言平面中的字符,而不能用于 BMP 范围外的字符(0000FFFF)。对于 UCA 5.2.0 排序规则,十六进制表示可以用于任何字符。

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

<strong>语法规则</strong>

LDML 有重置规则和 shift 规则来指定字符排序。排序是以一组规则开始的,首先是一个重置规则,该规则确定锚点,然后是一系列 shift 规则,它们指示如何将字符相对于锚点进行排序。

  • 一个 <reset> 规则本身不指定任何排序,而是重置 后续 shift 规则,使它们相对于给定的字符进行排序。以下任意一个规则将后续 shift 规则重置为相对于字母 'A' :

    <reset>A</reset>
    
    <reset>\u0041</reset>
  • 以下是<p><s><t>移位规则,它们定义了字符与另一个字符之间的主要、次要和 tertiary 差异:

    • 使用主要差异来区分单独的字母。

    • 使用次要差异来区分音调变化。

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

    这两个规则都指定了'G'字符的主要移位规则:

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

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

    表12.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>
  • 收缩是一条shift规则,用于排序多字符序列。MySQL 支持 2 到 6 个字符长的收缩。以下规则将三字符序列 'xyz' 在主要级别中排在 'a' 之后:

    <reset>a</reset>
    <p>xyz</p>
  • 长扩展和长收缩可以同时使用。这些规则将三字符序列 'xyz' 在主要级别中排在三字符序列 'abc' 之后:

    <reset>abc</reset>
    <p>xyz</p>
  • 正常扩展语法使用 <x><extend> 元素来指定扩展。以下规则将字符 'k' 在次要级别中排在序列 'ch' 之后。也就是说,'k' behave as if it expands to a character after 'c' followed by 'h'

    <reset>c</reset>
    <x><s>k</s><extend>h</extend></x>

    这种语法允许长序列。这些规则将序列 'ccs' 在 tertiary级别中排在序列 '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属性。通常,shift规则在重置规则后指示排序后的字符。但是,如果重置规则具有before属性,那么shift规则将指示排序前的字符。以下规则将字符'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'在主要级别中排列在非忽略字符的上方,这些字符具有Default Unicode Collation Element Table(DUCET)条目且不是CJK:

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

    逻辑位置具有以下表格所示的代码点:

    表12.6 逻辑重置位置代码点

    Logical Position Unicode 4.0.0 Code Point Unicode 5.2.0 Code Point
    <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属性,该属性影响字符权重计算的 shift 规则。该属性具有以下 permitted 值:

    • simple: 对 reset 规则没有before属性的字符权重进行计算。这是默认值,如果不提供该属性。

    • expand: 对 shift 规则使用扩展。

    假设<code class="literal">'0' 和 <code class="literal">'1' 的权重分别为<code class="literal">0E29 和 <code class="literal">0E2A'0' 和 <code class="literal">'1' 之间:

    <reset>0</reset>
    <pc>abcdefghijklmnopqrstuvwxyz</pc>

    对于简单 shift 模式,权重计算如下:

    'a' has weight 0E29+1
    'b' has weight 0E29+2
    'c' has weight 0E29+3
    ...

    然而,没有足够的空闲位置将 26 个字符放置在<code class="literal">'0' 和 <code class="literal">'1'

    要解决这个问题,请使用<code class="literal">shift-after-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> 元素中包含可选的 version 属性,以指示该排序基于哪个 UCA 版本。如果省略了 version 属性,它的默认值为 4.0.0。例如,这个规范表明一个基于 UCA 5.2.0 的排序:

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