文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


12.14.4.2 MySQL 支援的 LDML 語法

本節說明 MySQL 可辨識的 LDML 語法。這是 LDML 規格中描述的語法子集,可在 http://www.unicode.org/reports/tr35/ 找到,應參考該文件以取得更多資訊。MySQL 可辨識足夠大的語法子集,因此在許多情況下,可以從 Unicode 通用地區設定資料儲存庫下載校對定義,並將相關部分(也就是 <rules></rules> 標籤之間的部分)貼到 MySQL Index.xml 檔案中。此處描述的規則全部支援,除了字元排序僅發生在主要層級之外。指定次要或更高排序層級差異的規則會被辨識(因此可以包含在校對定義中),但在主要層級上會被視為相等。

MySQL 伺服器會在剖析 Index.xml 檔案時發現問題時產生診斷資訊。請參閱第 12.14.4.3 節,「在 Index.xml 剖析期間的診斷」

字元表示法

LDML 規則中命名的字元可以按字面寫入,或以 \unnnn 格式寫入,其中 nnnn 是十六進位 Unicode 碼點值。例如,Aá 可以按字面寫入,或寫成 \u0041\u00E1。在十六進位值中,數字 AF 不區分大小寫;\u00E1\u00e1 是等效的。對於 UCA 4.0.0 校對,十六進位表示法只能用於基本多語平面中的字元,不能用於 0000FFFF BMP 範圍之外的字元。對於 UCA 5.2.0 校對,十六進位表示法可用於任何字元。

Index.xml 檔案本身應使用 UTF-8 編碼寫入。

語法規則

LDML 有重設規則和移位規則來指定字元排序。排序會以一組規則給定,這些規則以建立錨點的重設規則開始,後面接著指示字元如何相對於錨點排序的移位規則。

  • <reset> 規則本身不指定任何排序。相反地,它會重設後續移位規則的排序,以使其與給定字元相關聯。以下任一規則都會重設後續移位規則,使其與字母 'A' 相關聯。

    <reset>A</reset>
    
    <reset>\u0041</reset>
  • <p><s><t> 移位規則定義字元與另一個字元的主要、次要和三次差異

    • 使用主要差異來區分不同的字母。

    • 使用次要差異來區分重音符號變化。

    • 使用三次差異來區分字母大小寫變化。

    以下任一規則都會指定字元 'G' 的主要移位規則

    <p>G</p>
    
    <p>\u0047</p>
  • <i> 移位規則指示一個字元的排序與另一個字元相同。以下規則會使 'b' 的排序與 'a' 相同

    <reset>a</reset>
    <i>b</i>
  • 縮寫的移位語法使用一組標籤指定多個移位規則。下表顯示縮寫語法規則與等效的非縮寫規則之間的對應關係。

    表 12.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 屬性。通常,重設規則之後的 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' 在主要層級的權重設為大於具有預設 Unicode 校對元素表 (DUCET) 條目且不是 CJK 的非可忽略字元。

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

    邏輯位置具有下表所示的碼位。

    表 12.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 屬性,此屬性會影響 shift 規則的字元權重計算。此屬性允許以下值:

    • simple:計算字元權重的方式與不具有 before 屬性的重設規則相同。如果未提供屬性,則這是預設值。

    • expand:針對重設規則之後的 shift 使用擴展。

    假設 '0''1' 的權重為 0E290E2A,並且我們想要將所有基本拉丁字母放在 '0''1' 之間。

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

    在 simple shift 模式下,權重計算如下:

    '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 是字元 0xA48C 的 UCA 4.0.0 權重,此字元是最後一個非可忽略字元(校對中排序最大的字元,不包括 CJK)。UCA 5.2.0 類似,但使用 3ACA,對應字元 0x1342E

MySQL 特有的 LDML 擴展

LDML 規則的擴展允許 <collation> 元素在 <collation> 標籤中包含可選的 version 屬性,以指示校對所依據的 UCA 版本。如果省略 version 屬性,則其預設值為 4.0.0。例如,此規格表示以 UCA 5.2.0 為基礎的校對:

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