このページは機械翻訳したものです。
このセクションでは、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 形式で書き込めます。ただし、nnnnnnnn は 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>