#### 10.14.4.2 MySQL 支持的 LDML 语法

[](<>)

本节描述 MySQL 识别的 LDML 语法。这是 LDML 规范中描述的语法的子集，可在<http://www.unicode.org/reports/tr35/>, 应咨询以获取更多信息。MySQL 可以识别足够大的语法子集，在许多情况下，可以从 Unicode Common Locale Data Repository 下载排序规则定义并粘贴相关部分（即，`<规则>`和`</规则>`标签）进入MySQL`索引.xml`文件。此处描述的规则都受支持，除了字符排序仅发生在初级级别。在二级或更高排序级别指定差异的规则被识别（因此可以包含在排序规则定义中），但在主要级别被视为相等。

MySQL 服务器在解析数据时发现问题时生成诊断`索引.xml`文件。看[第 10.14.4.3 节，“Index.xml 解析期间的诊断”](collation-diagnostics.html).

**字符表示**

以 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>
```
