ソートのルールは、言語ごとに異なります。従来の方法では、テキストは、文字のエンコードに使用されるバイナリ・コードに従ってデータベース内でソートされます。通常、この方法では、言語的に意味のあるソート順序は生成されません。言語ソートでは、様々な言語および文化の複雑なソート要求が処理されます。言語ソートを使用すると、文字データ型(CHAR、VARCHAR2、NCHARおよびNVARCHAR2)のテキストを特定の言語の慣習に従ってソートできます。
言語ソートでは、各文字を、その文字の言語的に適切な順序を反映した数値に置き換えることによって処理が行われます。TimesTenでは、単一言語ソートおよび多言語ソートの2種類の言語ソートが提供されています。
この項の内容は次のとおりです。
単一言語ソートの場合、TimesTenでは文字列を2つのステップで比較します。1つめのステップでは、文字列全体のメジャー値をメジャー値の表と比較します。通常、同じ外観の文字は、メジャー値が同じです。2つめのステップでは、文字列全体のマイナー値をマイナー値の表と比較します。メジャー値とマイナー値は、TimesTenによって定義されます。TimesTenでは、アクセントおよび大/小文字の相違のある文字は、メジャー値は同じで、マイナー値は異なると定義されます。
単一言語ソートは、シングルバイトおよびUnicodeのデータベース・キャラクタ・セットでのみ使用可能です。キャラクタ・セットがUnicode以外のマルチバイトの場合、単一言語ソートを指定すると、デフォルトのソート順はデータベース・キャラクタ・セットのバイナリ・ソート順となります。
サポートされているソートのリストは、「サポートされている言語ソート」を参照してください。
TimesTenでは、1回のソートで複数の言語のデータをソートできるように多言語ソートが提供されています。多言語ソートは、ISO/OEC 14651 - International String OrderingおよびUnicode照合アルゴリズム規格に基づいています。このフレームワークによって、複雑なソート・ルールを持つ言語(アジア言語など)の処理、および多言語データを持つデータベースに対する言語的なサポートの提供がデータベースで可能になります。
また、多言語ソートでは、標準等価性および補助文字を処理できます。標準等価性とは、文字または文字列間での基本的な等価性のことです。たとえば、çはcと,との組合せと等価です。
たとえば、TimesTenでは、フランス語の単一言語ソート(FRENCH)がサポートされていますが、ユーザーはフランス語の多言語ソート(FRENCH_M)を指定できます。_Mは、多言語ソートのISO 14651規格を表しています。ソート順は、GENERIC_Mソート順に基づいており、アクセントを右から左にソートできます。表に多言語データが含まれている場合は、多言語ソートを使用することをお薦めします。表にフランス語のみが含まれている場合は、フランス語の単一言語ソートを使用すると、メモリーの使用量が少なくなるため、パフォーマンスが向上する可能性があります。フランス語の単一言語ソートでは、フランス語の多言語ソートより少ない文字が定義されているため、メモリーの使用量が少なくなります。ソートの有効範囲とパフォーマンスのバランスを考慮する必要があります。
サポートされている多言語ソートのリストは、「サポートされている言語ソート」を参照してください。
データベース内部の処理では、大/小文字およびアクセントが区別されます。大/小文字およびアクセントを区別しないソートを実行する必要がある場合もあります。
大/小文字およびアクセントを区別しない言語ソートを指定するには、次の操作を実行します。
NLS_SORTデータ・ストア接続属性で、言語比較に使用する照合順番を指定します。NLS_SORTの値は、SQLの文字列比較演算子およびORDER BY句に影響を与えます。
ALTER SESSION文を使用すると、NLS_SORTの値を変更できます。
ALTER SESSION SET NLS_SORT=SWEDISH;
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');
NLSSORTの使用例については、『Oracle TimesTen In-Memory Database SQLリファレンス・ガイド』のNLSSORTに関する説明を参照してください。
言語索引を作成すると、言語比較時のパフォーマンスを向上させることができます。言語索引には、ソート・キー値用の記憶域が必要です。
言語索引を作成するには、次のような文を使用します。
CREATE INDEX german_index ON employees
(NLSSORT(employee_id, 'NLS_SORT=GERMAN'));
オプティマイザによって、NLSSORTおよびNLS_SORTの値に基づいて適切な索引が選択されます。
1つの列に対して複数の言語ソートが必要な場合は、複数の言語索引を作成する必要があります。たとえば、同じ列に対してGERMANとGERMAN_CIソートの両方を使用する場合は、2つの言語索引を作成します。
詳細は、『Oracle TimesTen In-Memory Database SQLリファレンス・ガイド』のCREATE INDEXに関する説明を参照してください。