言語ソート・ルールでのサポートされている言語規則

ソートのルールは、各言語によって異なります。これまで、テキストは文字のエンコードに使用されるバイナリ・コードに従ってデータベース内でソートされてきました。通常、この方法では、言語的に意味のある順序ではソートされません。様々な言語および文化の複雑なソート要求には、言語ソートで処理します。

これにより、CHARVARCHAR2NCHARおよびNVARCHAR2などの文字データ型のテキストを特定の言語規則に従ってソートできます。

言語ソートでは、各文字を、その文字の言語的に適切な順序を反映した数値に置き換えることによって処理が行われます。TimesTenでは、単一言語ソートおよび多言語ソートの2種類の言語ソートが提供されています。

この項の内容は次のとおりです。

単一言語ソート

単一言語ソートの場合、TimesTenでは文字列を2つのステップで比較します。

1つめのステップでは、文字列全体のメジャー値をメジャー値の表と比較します。通常、同じ外観の文字は、メジャー値が同じです。2つめのステップでは、文字列全体のマイナー値をマイナー値の表と比較します。メジャー値とマイナー値は、TimesTenによって定義されます。TimesTenでは、アクセントおよび大/小文字の相違のある文字は、メジャー値は同じで、マイナー値は異なると定義されます。

単一言語ソートは、シングルバイトおよびUnicodeのデータベース文字セットでのみ使用可能です。文字セットがUnicode以外のマルチバイトの場合、単一言語ソートを指定すると、デフォルトのソート順はデータベース文字セットのバイナリ・ソート順となります。

サポートされているソートのリストについては、『Oracle TimesTen In-Memory Databaseリファレンス』NLS_SORTを参照してください。

多言語ソート

TimesTenでは、1回のソートで複数の言語のデータをソートできるように多言語ソートが提供されています。

多言語ソートは、ISO/OEC 14651 - International String OrderingおよびUnicode照合アルゴリズム規格に基づいています。このフレームワークによって、複雑なソート・ルールを持つ言語(アジア言語など)の処理、および多言語データを持つデータベースに対する言語的なサポートの提供がデータベースで可能になります。

また、多言語ソートでは、標準等価性および補助文字を処理できます。標準等価性とは、文字または文字列間での基本的な等価性のことです。たとえば、çはcと,との組合せと等価です。

たとえば、TimesTenでは、フランス語の単一言語ソート(FRENCH)がサポートされていますが、ユーザーはフランス語の多言語ソート(FRENCH_M)を指定できます。_Mは、多言語ソートのISO 14651規格を意味します。ソート順は、GENERIC_Mソート順に基づいており、アクセントを右から左にソートできます。表に多言語データが含まれている場合は、多言語ソートを使用することをお薦めします。表にフランス語のみが含まれている場合は、メモリーの使用量が少ないフランス語の単一言語ソートを使用すると、パフォーマンスが向上する可能性があります。フランス語の単一言語ソートでは、フランス語の多言語ソートより少数の文字が定義されているため、メモリーの使用量が少なくなります。どの方法を使用するかは、ソートの範囲とパフォーマンスのトレードオフになります。

サポートされている多言語ソートのリストについては、『Oracle TimesTen In-Memory Databaseリファレンス』NLS_SORTを参照してください。

大/小文字およびアクセントを区別しない言語ソート

データベース内部の処理では、大/小文字およびアクセントが区別されます。大/小文字およびアクセントを区別しないソートを実行する必要がある場合もあります。

大/小文字およびアクセントを区別しない言語ソートを指定するには、次の操作を実行します。

  • TimesTenソート名の末尾に_CIを追加すると、ソートで大/小文字が区別されません。次に例を示します:

    BINARY_CI: アクセントを区別し、大/小文字を区別しないバイナリ・ソート

    GENERIC_M_CI: アクセントを区別し、大/小文字を区別しないGENERIC_Mソート

  • TimesTenソート名の末尾に_AIを追加すると、ソートでアクセントおよび大/小文字が区別されません。次に例を示します:

    BINARY_AI: アクセントおよび大/小文字を区別しないバイナリ・ソート

    FRENCH_M_AI: アクセントおよび大/小文字を区別しないFRENCH_Mソート

言語ソートの実行

NLS_SORT データ・ストア接続属性で、言語比較に使用する照合順番を指定します。NLS_SORTの値は、SQLの文字列比較演算子およびORDER BY句に影響を与えます。

ALTER SESSION文を使用すると、NLS_SORTの値を変更できます。

Command> ALTER SESSION SET NLS_SORT=SWEDISH;
Command> SELECT product_name FROM product ORDER BY product_name;

PRODUCT NAME
------------
aerial
Antenne
Lcd
ächzen
Ähre

また、SQL関数NLSSORTを使用して言語ソートを実行することによって、NLS_SORTの設定を無視することもできます。

SELECT * FROM test ORDER BY NLSSORT(name,'NLS_SORT=SPANISH');

ノート:

TimesTenでは、マテリアライズド・ビューおよびキャッシュ・グループに対して、この属性を接続文字列またはDSN定義で使用するのではなく、SQL関数のNLSSORT()を使用して照合順番を明示的に指定することをお薦めします。

Oracle TimesTen In-Memory DatabaseリファレンスNLS_SORTを参照してください。NLSSORTの使用例については、Oracle TimesTen In-Memory Database SQLリファレンスNLSSORTを参照してください。

言語索引の使用

言語索引を作成すると、言語比較時のパフォーマンスを向上させることができます。言語索引には、ソート・キー値用の記憶域が必要です。

言語索引を作成するには、次のような文を使用します。

CREATE INDEX german_index ON employees 
    (NLSSORT(employee_id, 'NLS_SORT=GERMAN'));

オプティマイザによって、NLSSORTおよびNLS_SORTの値に基づいて適切な索引が選択されます。

1つの列に対して複数の言語ソートが必要な場合は、複数の言語索引を作成する必要があります。たとえば、同じ列に対してGERMANGERMAN_CIソートの両方を使用する場合は、2つの言語索引を作成します。

Oracle TimesTen In-Memory Database SQLリファレンスCREATE INDEXを参照してください。