このセクションでは、MySQL が認識する LDML 構文について説明します。 これは、http://www.unicode.org/reports/tr35/ で入手できる LDML 仕様で説明されている構文のサブセットであり、詳細についてはこの仕様を参照してください。 MySQL は、サイズの大きい構文のサブセットを認識するので、多くの場合、Unicode 共通ロケールデータリポジトリから照合順序定義をダウンロードして、該当する部分 (<rules>
タグと </rules>
タグの間の部分) を MySQL Index.xml
ファイルに貼り付けることが可能です。 ここで説明するルールは、文字のソートがプライマリレベルのみで行われることを除いて、すべてサポートされます。 セカンダリ以上のソートレベルでの差を指定するルールは認識されますが (たとえば、照合順序の定義に含めることができます)、プライマリレベルでは等式として扱われます。
MySQL Server は、Index.xml
ファイルの構文解析中に問題を検出すると、診断を生成します。 セクション10.14.4.3「Index.xml の構文解析中の診断」を参照してください。
文字表現
LDML ルールで名前が付けられた文字は、文字どおりに、または \u
形式で書き込めます。ただし、nnnn
nnnn
は 16 進 Unicode コードポイント値です。 たとえば、A
と á
は、文字どおりに、または \u0041
および \u00E1
として書き込めます。 16 進数の値内では、A
から F
までの桁は大/小文字が区別されません。\u00E1
と\u00e1
は同等です。 UCA 4.0.0 照合順序の場合、16 進表記は、Basic Multilingual Plane の文字にのみ使用でき、0000
から FFFF
の BMP 範囲外の文字には使用できません。 UCA 5.2.0 照合順序の場合、16 進表記をすべての文字に使用できます。
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>
-
略記されたシフト構文は、タグの単一のペアを使用して、複数のシフトルールを指定します。 次の表は、略記された構文ルールと同等の略記されていないルールとの対応を示します。
表 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'
を 3 文字のシーケンス'abc'
よりも大きくします。<reset>abc</reset> <p>z</p>
-
短縮形式は、複数文字のシーケンスをソートするシフトルールです。 MySQL は、2 から 6 文字長の短縮形式をサポートしています。 次のルールは、プライマリレベルで 3 文字のシーケンス
'xyz'
を'a'
よりも大きくします。<reset>a</reset> <p>xyz</p>
-
長い拡張形式と長い短縮形式を一緒に使用できます。 次のルールは、プライマリレベルで 3 文字のシーケンス
'xyz'
を 3 文字のシーケンス'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'
を、Default Unicode Collation Element Table (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'
が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 ...
ただし、
'0'
から'1'
の間には 26 個の文字を設定するのに十分な未使用の位置がありません。 数字と文字が混在する結果になります。これを解決するには
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 も同様ですが、文字0x1342E
に3ACA
を使用します。
MySQL 固有の LDML 拡張機能
LDML ルールの拡張により、<collation>
要素では、照合のベースとなる UCA バージョンを示すオプションの version
属性を <collation>
タグに含めることができます。 version
属性を省略すると、そのデフォルト値は 4.0.0
になります。 たとえば、次の指定は、UCA 5.2.0 に基づいている照合順序を示します。
<collation id="nnn" name="utf8_xxx_ci" version="5.2.0">
...
</collation>