本節說明 MySQL 可辨識的 LDML 語法。這是 LDML 規格中所述語法的子集,可在 http://www.unicode.org/reports/tr35/ 中找到,應查閱該規格以取得更多資訊。MySQL 可辨識的語法子集範圍很大,在許多情況下,可以從 Unicode Common Locale Data Repository 下載排序定義,並將相關部分(即 <rules>
和 </rules>
標籤之間的部分)貼到 MySQL Index.xml
檔案中。此處描述的規則皆受支援,但字元排序僅發生在主要層級。指定次要或更高排序層級差異的規則可被辨識(因此可以包含在排序定義中),但在主要層級會被視為相等。
MySQL 伺服器在剖析 Index.xml
檔案時發現問題時,會產生診斷訊息。請參閱第 12.14.4.3 節「Index.xml 剖析期間的診斷」。
字元表示法
LDML 規則中命名的字元可以文字形式或 \u
格式撰寫,其中 nnnn
nnnn
是十六進位 Unicode 碼位值。例如,A
和 á
可以文字形式撰寫,或寫成 \u0041
和 \u00E1
。在十六進位值中,數字 A
到 F
不區分大小寫;\u00E1
和 \u00e1
是相等的。對於 UCA 4.0.0 排序,十六進位表示法只能用於基本多文種平面中的字元,不能用於 BMP 範圍 0000
到 FFFF
之外的字元。對於 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'
的權重分別為0E29
和0E2A
,並且我們想要將所有基本拉丁字母放在'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>