MySQL 8.0 リファレンスマニュアル


10.14.4.2 MySQL でサポートされる LDML 構文

このセクションでは、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 ルールで名前が付けられた文字は、文字どおりに、または \unnnn 形式で書き込めます。ただし、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'0E290E2A の重みを持ち、すべての基本ラテン文字を '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 も同様ですが、文字 0x1342E3ACA を使用します。

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>

関連キーワード:  文字, セット, ルール, 照合, 順序, 構文, ignorable, リセット, シフト, レベル