Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.1Mb
HTML Download (Zip) - 7.2Mb


10.4.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.4.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.2 略記されたシフト構文

    略記された構文 略記されていない構文
    <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.3 論理リセット位置のコードポイント

    論理位置 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 拡張機能

MySQL 5.6 では、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>

User Comments
User comments in this section are, as the name implies, provided by MySQL users. The MySQL documentation team is not responsible for, nor do they endorse, any of the information provided here.
Sign Up Login You must be logged in to post a comment.