この章では、Oracle Database環境での文字列のソートと検索について説明します。文字列(文字値)間の相互の順序を決定するプロセスを照合と言います。2つの文字列があるときに、並び順がどちらも同じなのか、前後に分かれるのかは照合によって決まります。Oracleのドキュメントでは、照合のかわりにソートという用語がよく使用されます。
表の列のような文字列のセットが、指定の検索条件と等しい値なのか、検索パターンと一致する値なのかを調べる際に、値を等しいと判定する基準が特に重要になります。検索で使用されるSQLの演算子と関数は、'='
、LIKE
、REGEXP_LIKE
、INSTR
、およびREGEXP_INSTR
です。この章では、一致という言葉は、等価演算子=
を使用して文字列全体が等しいと判定できる場合、あるいはLIKE
、REGEXP_LIKE
、またはREGEXP_INSTR
を使用して文字列がパターンと一致するため、部分文字列が等しいと判定できる場合を意味するものとします。Oracle Textにより、Oracle Databaseの高度なフルテキスト検索機能が提供されます。
1つのセットの中にある文字列を並べ替えることをソートと言います。たとえば、ORDER
BY
句の場合は、問合せ結果をソートするために、文字列の順序の決定に照合が使用され、PL/SQLの場合は、VARCHAR2
値で索引付けられた結合配列の中の文字列をソートするために照合が使用され、また、MIN
、MAX
、GREATEST
、およびLEAST
の各関数の場合は、最も短い文字値または最も長い文字値を探すために照合が使用されます。
文字列の並び順の決定に適用できる照合は様々です。標準的、慣習的な話し言葉を考慮に入れた照合のことを言語照合と言います。文字列の順序は、ある言語で書かれた辞書、電話帳などの文字で構成される一覧と同様です。対照的に、バイナリ照合の場合は、それぞれの文字列が単純なバイトの並びとして扱われ、バイナリ表現(文字コード)に基づいて文字列が並べ替えられます。
関連項目:
『Oracle Textアプリケーション開発者ガイド』
この章の内容は、次のとおりです。
照合は言語によって異なります。さらに、同じアルファベットを使用している文化または国の間でも、文字のソート方法が異なる場合があります。たとえば、デンマークのÆは、Z
の後にきます。また、Y
とÜ
は同じ文字の変形とみなされます。
照合では、大/小文字区別の有無を指定できます。ケースは、大文字であるか小文字であるかの条件を指します。たとえばラテン・アルファベットの場合、A
が大文字で、それに対する小文字がa
です。
照合では、発音区別記号を無視するか考慮するかを指定できます。発音区別記号は、文字または文字列の上または下にある記号で、それが付いていない場合の文字とは発音が異なることを示します。たとえば、façade
の場合、セディラ(,
)は発音区別記号です。セディラが付いている場合は、c
の発音が変化します。
表音的な照合順序や、文字の外観に基づいた照合順序も指定できます。たとえば、東南アジアの表意文字の場合は、画数に基づいた照合を指定できます。照合の一般的な問題となるものに、結合文字があります。たとえば、伝統的なスペイン語のch
は1つの独立した文字であり、ソート順序ではc
の後にきます。つまり、正しいソート順序は、cerveza、colorado、cheremoyaのようになります。したがって、文字c
は、次にくる文字がh
であるかどうかが確認されるまで、ソートされません。
Oracle Databaseには、次のタイプの照合があります。
バイナリ
単一言語
多言語
Unicode照合アルゴリズム(UCA)
単一照合はその言語固有の文字の順序に従って並べ替えるようになっていますが、多言語照合とUCA照合は、様々な言語をまとめて処理できるようになっています。さらに、UCA照合は、Unicode規格で、国際照合標準ISO 14651と完全な互換性があるUnicode照合アルゴリズム(UCA)の仕様をすべて満たしています。UCA規格は、Unicodeのすべての文字、したがって世界中のすべての言語のすべての文字の、完全な言語的順序付けを提供しています。Unicodeアプリケーションは広くデプロイされているため、UCA照合は、多言語データのソートに最適です。
文字データをソートする方法の1つは、文字コード体系によって定義された文字の数値に基づいています。このようなソートをバイナリ照合と呼びます。バイナリ照合は最も高速なソート・タイプです。ASCIIやEBCDICの規格では、文字AからZを昇順の数値で定義しているため、英語のアルファベットについてはこのタイプで正しいソート結果が得られます。
注意:
ASCII規格では、大文字はすべて小文字の前にきます。逆に、EBCDIC規格では、小文字はすべて大文字の前にきます。
他の言語で使用されている文字が存在すると、通常、バイナリ照合では正しい結果が得られません。たとえば、文字コード体系で、Ä
の数値がB
の数値より高い場合、昇順のORDER
BY
問合せでは、ABC
、ABZ
、BCD
、ÄBC
の順で文字列が戻ります。表意文字を使用するアジア言語の場合、通常、バイナリ照合に言語的な意味はありません。
文字のアルファベット順に一致する照合基準を得るには、文字コード体系内の数値に依存せずに文字をソートする別のソート方法を使用する必要があります。この方法を言語照合と呼びます。言語照合では、各文字を、その文字の言語的に適切な順序を反映した数値に置き換えることによって処理が行われます。
この項の内容は、次のとおりです。
Oracle Databaseでは、単一言語照合の場合、文字列は2つの手順で比較されます。最初の手順では、メジャー値テーブルにある文字列全体のメジャー値が比較されます。通常、同じ外観の文字には、同じメジャー値があります。第2の手順では、マイナー値テーブルにあるマイナー値が比較されます。メジャー値とマイナー値はOracleデータベースによって定義されます。Oracleデータベースでは、マイナー値が異なる同じメジャー値を使用して、発音区別記号を持つ文字と大/小文字区別を定義します。
各メジャー・テーブル・エントリには、1文字のUnicodeコード・ポイントとメジャー値が含まれています。Unicodeコード・ポイントは、1文字を表す16ビットのバイナリ値です。
表5-1に、a
、A
、ä
、Ä
およびb
のソートに使用するサンプルの値を示します。
表5-1 絵文字のサンプルとそのソートのメジャー値とマイナー値
絵文字 | メジャー値 | マイナー値 |
---|---|---|
a |
15 |
5 |
A |
15 |
10 |
ä |
15 |
15 |
Ä |
15 |
20 |
b |
20 |
5 |
注意:
単一言語照合は、Unicode以外のマルチバイト・データベース・キャラクタ・セットには使用できません。キャラクタ・セットがUnicode以外のマルチバイトの場合、単一言語照合を指定すると、デフォルトのソート順はデータベース・キャラクタ・セットのバイナリ・ソート順となります。例外の1つに、UNICODE_BINARY
があります。この照合は、すべてのキャラクタ・セットに使用できます。
関連項目:
Oracle Databaseには多言語照合が用意されているため、複数言語のデータを1つのソートとしてソートできます。この機能は、複雑なソート・ルールや多言語データベースを持つ地域または言語に有効です。Oracle Database 12cの時点で、Oracle Databaseは、以前のリリースによって定義された照合のすべてをサポートしています。
アジア諸国の言語データや多言語データに対しては、ISO 14651規格に基づいたソート・メカニズムが用意されています。たとえば、漢字は、画数、ピンイン(中国語の発音記号)または部首で順序付けできます。
また、多言語照合では、標準的な同値化および補助文字を処理できます。標準的な同値化は、文字間または文字列間での基本的な同値化です。たとえば、ç
は、c
と,
の組合せと同じです。補助文字はUnicodeでのユーザー定義文字または事前定義済の文字であり、特定のコード範囲内の2つのコード・ポイントを必要とします。1つの多言語ソートに最大110万のコード・ポイントを定義できます。
たとえば、Oracle Databaseではフランス語の単一言語ソート(FRENCH
)がサポートされていますが、フランス語の多言語照合(FRENCH_M
)を指定できます。_M
は、多言語ソートに対するISO 14651規格を表します。このソート順では、GENERIC_M
ソート順に基づき、発音区別記号を右から左へとソートできます。多言語ソートは、通常、表に多言語データが含まれる場合に使用されます。表にフランス語のみが含まれている場合は、メモリーの使用量が少ないフランス語の単一言語ソートを使用すると、パフォーマンスが向上する可能性があります。メモリー使用量が少ないのは、フランス語の単一言語ソートの方が、フランス語の多言語ソートよりも定義されている文字が少ないためです。どの方法を使用するかは、ソートの範囲とパフォーマンスのトレードオフになります。
関連項目:
1次レベル照合では、文字aと文字bの相違など、ベース
文字
間の相違を識別します。a
がb
の前にくるか、b
がa
の前にくるか、あるいは同等かの定義は、個々のロケールに準じます。文字をバイナリで表現することは、意味のないことです。無視可能な文字には、0(ゼロ)の1次レベルの順序(重み)を割り当てます。その結果、その文字は1次レベルで無視されます。他のレベルでの無視可能文字には、そのレベルで順序0(ゼロ)が割り当てられます。
たとえば、1次レベルでは、bat
のすべてのバリエーションが、bet
のすべてのバリエーションより前にきます。どちらの場合も、それぞれのバリエーションは次のように様々な順序で表示されます。
Bat bat BAT BET Bet bet
関連項目:
3次レベル照合では、ベース文字(1次レベル照合)、発音区別記号(2次レベル照合)およびケース(大文字と小文字)が識別されます。さらに、+
、-
および*
などの特殊文字も識別できます
次に3次レベル照合の例を示します。
文字a
とA
は、1次レベルと2次レベルでは同じ文字ですが、3次レベルでは異なる文字です。これは、ケースが異なるためです。
文字ä
とA
は、1次レベルでは同じ文字ですが、2次レベルと3次レベルでは異なる文字です。
ダッシュ文字-
の1次レベルと2次レベルでの順序は、0(ゼロ)です。つまり、この文字は、1次と2次のレベルでは無視されます。ダッシュを1次レベルの重みが0(ゼロ)以外の別の文字、たとえば、u
と比較しても、1次レベルでの結果は取得できません。これは、u
と比較する対象の文字がないためです。この場合は、3次レベルでのみ-
とu
の相違が検索されます。
次のリストは、1次レベル(resume
がresumes
の前)、2次レベル(発音区別記号なしの文字列が発音区別記号付きの文字列の前)および3次レベル(小文字が大文字の前)でソートされています。
resume Resume résumé Résumé resumes Resumes résumés Résumés
Unicode照合アルゴリズム(UCA)は、照合に関する国際的な規格であるISO 14651の仕様をすべて満たすUnicode規格です。それぞれに特徴を持った言語すべてを対象にした合理的なデフォルトの順序になるように、UCAに基づいてDefault Unicode Collation Element Table(DUCET)が定義されています。特定言語で正しい順序付けができるようにするために、その言語の言語要件を満たすようにDUCETを調整できます。各種言語に応じたDUCETの調整版が、Unicode Common Locale Data Repositoryに公開されています。UCAおよび関連の用語については、http://www.unicode.org
にある、Unicode照合アルゴリズムの情報を参照してください。
Oracle Databaseは、Oracle Database 12c (12.1.0.2)の時点で、UCA 6.2.0完全準拠のUCA照合を提供しています。DUCETに基づいて照合できるだけでなく、よく使用されている様々な言語の特性に合せて照合することができます。たとえば、UCA照合UCA0620_SCHINESE
を指定して、簡体字中国語を含む多言語データをソートできます。この照合は、簡体字中国語のデータをピンイン(中国語の発音記号)の順に表示します。
多言語データのソートではUCA照合をお薦めします。
1次レベルはベース文字を区別するために使用されます。多言語照合の1次レベル照合において使用される比較に類似しています。
関連項目:
ベース文字の違いの例は、「1次レベル照合」を参照してください
2次レベルは、ベース文字が同じである場合に、発音区別記号を区別するために使用されます。多言語照合の2次レベル照合において発音区別記号を区別するために使用される比較に類似しています。
関連項目:
発音区別記号の違いの例は、「2次レベル照合」を参照してください
3次レベルは、発音区別記号が同じであるベース文字でケースを区別するために使用されます。多言語照合の3次レベル照合においてケースを区別するために使用される比較に類似しています。さらに、UCA DUCET照合は、可変文字の重み付けに基づいて、句読点を1次または4次の重要性で処理します。これは、句読点を3次レベルの重要性で処理する、多言語照合の3次レベル照合とは異なります。
関連項目:
大/小文字が違う文字の例は、「3次レベル照合」を参照してください
4次レベル照合は、可変文字の重み付けがshiftedになっている場合に、可変文字とそれ以外の文字の間の区別に使用されます。これは、ベース文字と大/小文字の違いがない平仮名とカタカナの区別にも使用されます。図5-1に例を示します。
関連項目:
表5-2に、Oracle Database 12cのUCA照合でサポートされている照合パラメータと照合オプションを示します。
表5-2 UCA照合パラメータ
属性 | オプション | 照合修飾子 |
---|---|---|
|
primary secondary tertiary quaternary |
|
|
non-ignorable shifted blanked |
|
|
on off |
|
|
on |
|
|
off |
|
|
upper off |
|
|
on off |
|
|
off |
|
|
最小 |
|
脚注1
_S4
: alternateがshiftedの場合のみ該当
脚注2
_FU
: デンマーク語でのみ有効
脚注3
_FN
: それ以外の言語でのみ有効
パラメータstrength
は、UCA比較レベルを表します(「UCA比較レベル」を参照してください)。パラメータalternate
は、可変文字の重み付けの方法を制御します。パラメータbackwards
は、発音区別記号を逆順に検索するかどうか制御します。表5-2に示したオプションを使用して、これら3つのUCAパラメータを構成できます。表5-2に記載の他のパラメータのオプションは、調整された言語に基づいて、現在固定されており、Oracle Database 12cの時点では構成できません。
UCA照合パラメータとオプションの詳細は、「Unicode照合アルゴリズム規格」を参照してください(http://www.unicode.org
)。
この項では、次の言語照合機能の違いについて説明します。
言語照合は、必要な特性を含むようにカスタマイズできます。
関連項目:
ベース文字はベース文字表に定義されています。この表によって、各文字がベース文字にマップされます。たとえば、a
、A
、ä
およびÄ
はすべて、ベース文字であるaにマップされます。この概念は、Oracle Textで作業する場合に特に重要です。
関連項目:
『Oracle Textリファレンス』
多言語照合とUCA照合では、いくつかの文字が無視可能とみなされる場合があります。ソート操作または照合操作で無視可能文字を含む2つの値(文字列)を比較する際、無視可能文字はスキップされ、存在しないものとして処理されます。無視可能文字には、1次無視可能文字、2次無視可能文字、および3次無視可能文字の3種類があります。
1次無視可能文字は、任意の比較に適用される多言語照合またはUCA照合の定義にアクセントを区別しない修飾子_AI
がある場合(GENERIC_M_AI
、UCA0620_DUCET_AI
など)に無視されます。1次無視可能文字は各種アルファベット(ラテン、キリル、ギリシャ、デーバナーガリ、カタカナなど)の発音区別記号(アクセント)から構成されていますが、Enclosing CircleやEnclosing Squareなどの装飾修飾子も含まれます。これらの文字は分音結合文字で、前の文字と結合して1つのアクセント付き文字または装飾付き文字になります(分音とは、画面上あるいは紙面上の前の文字と重なる文字のことです)。たとえば、英小文字eの後ろにCombining Grave Accentを付けると1文字のèになり、英大文字Aの後ろにCombining Enclosing Circleを付けると1文字の(A)になります。分音文字がアクセントを区別しないソートで無視可能と定義されているため、このソートでは、たとえばrôle
とrole
、naïve
とnaive
、および(A)(B)(C)
とABC
を同値として処理できます。
Oracle Locale Builderユーティリティの多言語照合の定義では、1次無視可能文字は分音文字と呼ばれます。
2次無視可能文字は、適用される定義にアクセントを区別しない修飾子_AI
または大/小文字を区別しない修飾子_CI
がある場合に無視されます。
多言語照合の2次無視可能文字には、句読点(たとえば空白文字、改行制御コード、ダッシュ、様々な引用符形式、数学演算子、点、カンマ、感嘆符、様々な括弧形式など)が含まれます。アクセントを区別しない(_AI
)ソートや、大/小文字を区別しない(_CI
)ソートでは、このような句読点は無視されるため、multi-lingual
とmulti-lingual
、およびe-mail
とemail
をそれぞれ同じ文字として処理できます。
Oracle Locale Builderユーティリティの多言語照合の定義では、2次無視可能文字は句読点と呼ばれます。
しかし、UCA DUCETでは2次無視可能文字は定義されていません。UCAでは句読点は可変文字として処理されます。
言語比較では、3次無視可能文字は通常、無視されます。これらは主に制御コード、書式文字、異体字セレクタなどで構成されます。
標準的な大/小文字を区別するソートやアクセントを区別するソートが使用されている場合に、1次無視可能文字と2次無視可能文字は無視されません。ただし、文字列の順序を決定する際、無視可能文字は優先順位が低くなります。たとえば、GENERIC_M
ソートではmulti-lingual
はmultilingual
の後にソートされますが、依然としてmultidimensional
とmultinational
の間にソートされます。順序を決定する際、ベース文字の比較d < l < n
の方が、2次無視可能文字であるハイフン(U+002D)の有無よりも高い優先順位が付けられます。
多言語照合の定義における分音文字、句読点の完全なリストは、Oracle Locale Builderで定義を表示すると示されます。一般に、単一言語照合の定義には句読点も分音文字も含まれません。一部の単一言語照合の定義には、空白文字とタブ文字が含まれることがあります。比較アルゴリズムでは、マイナー値が各未定義文字に自動的に割り当てられます。これにより、句読点は無視できなくなりますが、多言語照合の場合と同様に、比較する文字列の順序を決定する際の優先順位は低くなります。単一言語照合での句読点間の順序はUnicodeコード・ポイントに基づいているため、ユーザーの予想とは一致しないことがあります。
UCAには、可変的な照合要素として定義されている文字があります。このような文字は可変文字と呼ばれ、空白文字、句読点、および特定の記号で構成されます。
UCA照合では、可変文字に異なる重み付けをして、ソートまたは比較でのそれらの文字の効果を調整することができます。これを可変重み付けと呼びます。その動作は、照合パラメータalternate
で制御されます。Oracle Database 12cのUCA照合では、可変重み付けのオプションとして次のものがサポートされています。
blanked
可変文字が無視可能文字として扱われます。たとえば、比較時に空白(U+0020)は無視されます。
non-ignorable
可変文字が、無視可能文字ではない文字として扱われます。たとえば、比較の1次レベルで空白(U+0020)は無視されません。
shifted
可変文字は、1次、2次および3次レベルで、無視可能文字とみなされます。さらに、新しい4次レベルが、すべての文字に対して使用されます。文字の4次重み付けは、文字が可変、無視可能、その他のいずれであるかに依存します。たとえば、4次レベルで空白文字(U+0020)にはA(U+0041)とは違う重み付けが割り当てられますが、これは、空白文字は可変文字であっても、Aは可変文字でも無視可能文字でもないからです。
関連項目:
可変重み付けの例
この項では様々な可変重み付けの例を示します。
例5-1 可変重み付けがBlankedに設定されている場合のUCA DUCETの順序
次の例は、UCA0620_DUCET_VB
を使用してソートしたときの例です。
blackbird Blackbird Black-bird Black bird BlackBird
空白文字(U+0020)とハイフン(U+002D)は無視可能文字として扱われるため、Blackbird
、Black-bird
、およびBlack
bird
は、照合時の重み付けが同じになります。区別されるエントリのみを選択すると、この動作がよくわかります(結果にBlackbird
だけが現れることに注意してください)。
blackbird Blackbird BlackBird
1番目のB(U+0042)の大/小文字の違いにより、Blackbird
、Black-bird
、およびBlack
bird
は、blackbird
の後にソートされますが、2番目のb
(U+0062)の大/小文字の違いにより、BlackBird
の前にソートされます。
例5-2 可変重み付けがNon-Ignorableに設定されている場合のUCA DUCETの順序
次の例は、UCA0620_DUCET_VN
を使用してソートしたときの例です。
Black bird Black-bird blackbird Blackbird BlackBird
SPACE(U+0020)とHYPHEN(U+002D)は、無視可能文字とみなされず、1次レベルでb
(U+0062)より小さいため、Black
bird
とBlack-bird
はblackbird
より前にソートされます。1次レベルでは空白文字(U+0020)はハイフン(U+002D)よりも小さいため、Black
bird
はBlack-bird
の前にソートされます。
例5-3 可変文字がshiftedと重み付けされている場合のUCA DUCET順序
次の例は、UCA0620_DUCET
を使用してソートしたときの例です。
blackbird Black bird Black-bird Blackbird BlackBird
SPACE(U+0020)とHYPHEN(U+002D)が最初の3つのレベルで無視され、最初のb
(U+0062)に大文字/小文字の相違があるため、blackbird
はBlack
bird
とBlack-bird
の前にソートされます。HYPHEN(U+002D)の4次重み付けがBlackbird
の文字b
(U+0062)より小さいため、Black-bird
はBlackbird
より前にソートされます。
照合要素は、通常、単一文字で構成されていますが、一部のロケールでは、1つの文字列に2つ以上の文字がある場合があります。その場合、その文字列はソート時にも単一の照合要素とみなす必要があります。たとえば、伝統的なスペイン語の文字列ch
は、2つの文字で構成されています。これらの文字は、多言語照合では短縮文字と呼ばれ、単一言語照合では、特殊組合せ文字と呼ばれます。
合成文字を短縮文字と混同しないでください。á
などの合成文字は、それぞれ独自のエンコーディングを持つa
と'
に分解できます。合成文字と短縮文字の違いは、合成文字が端末に1文字として表示できるのに対して、短縮文字はソートにのみ使用され、それを構成する文字はそれぞれ個別に表示される必要があることです。
日本語では、全角のダッシュ—
に似た長母音記号は、先行する文字の母音を長く伸ばすことを示す長音記号を表しています。ソート順序は、長音記号の前にある母音に応じて異なります。この方法は、状況依存照合と呼ばれます。たとえば、文字ka
の後にくる長音記号—
は、a
を長く伸ばすことを示し、a
と同じように処理されます。一方、文字ki
の後にくる長音記号—
は、i
を長く伸ばすことを示し、i
と同じように処理されます。これをラテン文字に変換すると、ソートは次のようになります。
kaa ka— -- kaa and ka— are the same kai -- kai follows ka- because i is after a kia -- kia follows kai because i is after a kii -- kii follows kia because i is after a ki— -- kii and ki— are the same
標準的な同値化は多言語照合の属性であり、同値のコード・ポイント順序のソート方法を記述したものです。標準的な同値化が特定の多言語照合に適用される場合、標準的に同値の文字列は同等とみなされます。
1つのUnicodeのコード・ポイントが、一連のベース文字のコード・ポイントに発音区別記号のコード・ポイントを加えたものと同じ値である場合があります。これは、Unicodeの標準的な同値化と呼ばれます。たとえば、ä
はウムラウト付きのベース文字a
と同じです。言語フラグCANONICAL_EQUIVALENCE = TRUE
は、特定の多言語照合にUnicodeに定義されている標準的な同値化規則をすべて適用する必要があることを示します。Oracle Database定義の多言語照合には、標準的な同値化フラグ用の適切な設定が含まれています。すべてのデータが合成された形式の場合は、このフラグをFALSE
に設定すると、比較と順序付け機能が高速になります。
たとえば、次の文字列を考えてみます。
äa
(a
ウムラウトの後にa
)
a¨b
(a
の後にウムラウトとb
)
äc
(a
ウムラウトの後にc
)
CANONICAL_EQUIVALENCE=FALSE
の場合、文字列のソート順序は次のようになります。
a¨b äa äc
これは、標準的な同値化が適用されない場合は、a
がä
の前にくるためです。
CANONICAL_EQUIVALENCE=TRUE
の場合、文字列のソート順序は次のようになります。
äa a¨b äc
これは、ä
とa¨
が標準的に同値として処理されるためです。
Oracle Locale Builderを使用すると、既存の多言語照合で標準的な同値化フラグの設定を表示できます。Oracle Locale Builderを使用してカスタマイズした多言語照合を作成する場合は、標準的な同値化フラグを必要に応じて設定できます。
関連項目:
標準的な同値化フラグの設定の詳細は、「Oracle Locale Builderを使用した新規言語ソートの作成」を参照してください
フランス語では、発音区別記号付き文字を含む文字列をソートする場合、最初にベース文字が左から右の順に比較されますが、発音区別記号付き文字自体は右から左の順に比較されます。たとえば、デフォルトでは、発音区別記号付き文字は、発音区別記号が付かない文字の後に置かれます。そのため、フランス語ソートでは、Èdit
はEdít
の前にきます。この2つの文字列は1次レベルでは同値です。2次レベルの順序は、発音区別記号付き文字を右から左へ調べてから決定されます。個別のロケールでは、発音区別記号付き文字を右から左のルールでソートするように要求できます。逆2次ソートを使用可能にするには、REVERSE_SECONDARY
言語フラグをTRUE
に設定します。
関連項目:
逆2次フラグの設定の詳細は、「Oracle Locale Builderを使用した新規言語ソートの作成」を参照してください
タイ語とラオ語の場合は、ソート前に一部の文字を後続の文字と最初に入れ替える必要があります。通常、この種の文字は、母音を表す記号であるため、次にくる文字は子音になります。子音と母音は、ソート前に入れ替える必要があります。ソート前に入れ替える必要があるすべての文字について、SWAP_WITH_NEXT
語フラグを設定してください。
関連項目:
SWAP_WITH_NEXT
フラグの設定の詳細は、「Oracle Locale Builderを使用した新規言語ソートの作成」を参照してください
1つの小文字が複数の大文字にマップされる場合があります。たとえば、伝統的なドイツ語では、ß
の大文字は、SS
です。
このような大/小文字の変換は、NLS_UPPER
、NLS_LOWER
およびNLS_INITCAP
のSQL関数によって、言語照合で設定された規則に従って処理されます。SQL関数UPPER
、LOWER
およびINITCAP
では、これらの特殊文字を処理できません。これは、大/小文字区別の操作が、言語に依存しない基礎となるキャラクタ・セットに定義されたバイナリ・マッピングに基づいているためです。
NLS_UPPER
SQL関数は、小文字の文字列と同じキャラクタ・セットからの大文字をすべて戻します。次の例に、NLS_SORT
がXGERMAN
に設定されている場合のNLS_UPPER
関数の結果を示します。
SELECT NLS_UPPER ('große') "Uppercase" FROM DUAL; Upper ----- GROSSE
関連項目:
『Oracle Database SQL言語リファレンス』
Oracle Database内の操作では、常に大/小文字およびアクセント(発音区別記号)が区別されます。大/小文字およびアクセントを区別しない比較と照合の実行が必要になる場合があります。
以前のバージョンのデータベースでは、NLS_UPPER
およびNLS_LOWER
SQL関数を使用して大/小文字区別なしの問合せを実行できました。この2つの関数は、特定の言語照合定義に基づいて文字列の大/小文字を変更します。これにより、使用言語に関係なく大/小文字を区別しない検索を実行できます。たとえば、次のようにtest1
表を作成します。
SQL> CREATE TABLE test1(word VARCHAR2(12)); SQL> INSERT INTO test1 VALUES('GROSSE'); SQL> INSERT INTO test1 VALUES('Große'); SQL> INSERT INTO test1 VALUES('große'); SQL> SELECT * FROM test1; WORD ------------ GROSSE Große große
GROSSE
に対して、次のように大/小文字を区別した検索を実行します。
SQL> SELECT word FROM test1 WHERE word='GROSSE'; WORD ------------ GROSSE
NLS_UPPER関数を使用し、GROSSE
に対して大/小文字を区別しない検索を実行します。
SELECT word FROM test1 WHERE NLS_UPPER(word, 'NLS_SORT = XGERMAN') = 'GROSSE'; WORD ------------ GROSSE Große große
Oracle Databaseの照合には、大/小文字の区別がなく、アクセントの区別のないオプションが用意されています。次のタイプの言語照合があります。
ベース文字、発音区別記号、句読点およびケースに関する情報を使用する言語照合。これらは、「言語照合の使用」で説明した標準的な言語照合です。
ベース文字、発音区別記号、句読点に関する情報を使用するが大/小文字に関する情報を使用しない単一言語の照合と、ベース文字、発音区別記号に関する情報を使用するが句読点、大/小文字に関する情報を使用しない多言語照合およびUCA照合。このタイプのソートを、大/小文字を区別しないソートと呼びます。
ベース文字と句読点に関する情報のみを使用する単一言語照合、およびベース文字に関する情報のみを使用する多言語照合とUCA照合。このタイプのソートを、アクセントを区別しないソートと呼びます。(アクセントは発音区別記号と同義です。)大/小文字を区別しないソートと同様、アクセントを区別しないソートでもケースに関する情報は使用しません。
アクセントおよび大/小文字を区別しない多言語照合では、「無視可能文字」に記載されているように、句読点は無視されます。
これ以降の内容は、次のとおりです。
後述の例は、次のソートを示しています。
ベース文字、発音区別記号、句読点およびケースに関する情報を使用する照合
大/小文字を区別しない照合
アクセントを区別しない照合
例5-4 ベース文字、発音区別記号、句読点およびケース情報を使用した言語照合
次のリストは、ベース文字、発音区別記号、句読点およびケース情報を使用してソートされています。
blackbird black bird black-bird Blackbird Black-bird blackbîrd bläckbird
例5-5 大/小文字を区別しない言語照合
次のリストは、ベース文字、発音区別記号および句読点情報を使用し、ケースを無視してソートされています。
black bird black-bird Black-bird blackbird Blackbird blackbîrd bläckbird
black-bird
とBlack-bird
の違いはケースのみのため、照合では同じ値となります。この2つの値は、リストでどちらが前にきてもかまいません。Blackbird
とblackbird
の値も照合では同じ値となり、リストでどちらが前にきてもかまいません。
例5-6 アクセントを区別しない言語照合
次のリストは、ベース文字情報のみを使用してソートされています。発音区別記号、句読点およびケース情報は使用されていません。
blackbird bläckbird blackbîrd Blackbird BlackBird Black-bird Black bird
NLS_SORT
セッション・パラメータを使用して、大/小文字またはアクセントを区別しない照合を指定します。
大/小文字を区別しない照合の場合は、Oracle照合名に_CI
を追加します。
アクセントも大/小文字も区別しない照合の場合は、Oracle照合名に_AI
を追加します。
たとえば、NLS_SORT
を次のタイプの値に設定できます。
UCA0620_SPANISH_AI FRENCH_M_AI XGERMAN_CI
バイナリ照合でも、大/小文字またはアクセントを区別しないように指定できます。NLS_SORT
の値としてBINARY_CI
を指定すると、アクセントを区別するが大/小文字は区別しない照合を指定したことになります。BINARY_AI
は、アクセントも大/小文字も区別しないバイナリ照合を指定します。キャラクタ・セットのバイナリ照合順序が使用中のキャラクタ・セットに適している場合は、バイナリ照合を使用します。
たとえば、NLS_LANG
環境変数をAMERICAN_AMERICA.WE8ISO8859P1
に設定し、次のようにtest2
という表を作成して移入します。
SQL> CREATE TABLE test2 (letter VARCHAR2(10)); SQL> INSERT INTO test2 VALUES('ä'); SQL> INSERT INTO test2 VALUES('a'); SQL> INSERT INTO test2 VALUES('A'); SQL> INSERT INTO test2 VALUES('Z'); SQL> SELECT * FROM test2; LETTER ----------- ä a A Z
NLS_SORT
のデフォルト値はBINARY
です。次の文を使用して、test2
表内の文字のバイナリ照合を実行します。
SELECT * FROM test2 ORDER BY letter;
NLS_SORT
の値を変更するには、次のような文を入力します。
ALTER SESSION SET NLS_SORT=BINARY_CI;
次の表に、NLS_SORT
をBINARY
、BINARY_CI
およびBINARY_AI
に設定した結果得られる照合順を示します。
BINARY | BINARY_CI | BINARY_AI |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
NLS_SORT=BINARY
の場合は、大文字が小文字の前にきます。発音区別記号付きの文字は最後に表示されます。
照合で発音区別記号は考慮されるが大/小文字は区別されない場合(BINARY_CI
)は、発音区別記号付きの文字が最後に表示されます。
大/小文字区別と発音区別記号がどちらも無視される場合(BINARY_AI
)、ä
はベース文字a
を持つ他の文字でソートされます。ベース文字a
を持つ文字はすべて、z
の前にきます。
キャラクタ・セットがUS7ASCIIまたはバイナリ照合と同じ照合順序を持つキャラクタ・セットの場合は、パフォーマンスを改善するためにバイナリ照合を使用できます。
次の表に、表のドイツ語照合の結果得られる照合順序を示します。
GERMAN | GERMAN_CI | GERMAN_AI |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
ドイツ語照合では、小文字が大文字の前にきて、ä
がZ
の前にきます。この照合で大/小文字区別と発音区別記号の両方が無視される場合(GERMAN_AI
)、ä
はベース文字a
を持つ他の文字を使用して表示されます。
この項の例は、バイナリ照合、単一言語照合および多言語照合を示しています。例を使用する準備として、表test3
を作成して移入します。次の文を入力します。
SQL> CREATE TABLE test3 (name VARCHAR2(20)); SQL> INSERT INTO test3 VALUES('Diet'); SQL> INSERT INTO test3 VALUES('À voir'); SQL> INSERT INTO test3 VALUES('Freizeit');
例5-7 バイナリ照合
SQL> SELECT * FROM test3 ORDER BY name;
次の出力が表示されます。
Diet Freizeit À voir
バイナリ照合の結果、À voir
がリストの最後に表示されることに注意してください。
例5-8 ドイツ語の単一言語照合
NLS_SORT
パラメータをgerman
に設定してNLSSORT
関数を使用し、ドイツ語照合を取得します。
SQL> SELECT * FROM test3 ORDER BY NLSSORT(name, 'NLS_SORT=german');
次の出力が表示されます。
À voir Diet Freizeit
ドイツ語照合では、À voir
がリストの先頭になることに注意してください。
例5-9 ドイツ語の単一言語照合とUCA照合の比較
図5-2に示した文字列をtest
に挿入します。この場合、横棒付きのD
の後にñ
がきます。
NLS_SORT
パラメータをgerman
に設定してNLSSORT
関数を使用し、ドイツ語の単一言語照合を実行します。
SELECT * FROM test2 ORDER BY NLSSORT(name, 'NLS_SORT=german');
ドイツ語照合からの出力では、新しい文字列がエントリ・リストの最後に表示されます。これは、その文字がドイツ語照合では認識されないためです。
次の文を入力してUCA照合を実行します。
SELECT * FROM test2 ORDER BY NLSSORT(name, 'NLS_SORT=UCA0620_DUCET');
出力では、UCAの順序に従って新しい文字列がDiet
の後に表示されます。
関連項目:
NLS_SORT
パラメータの設定と変更の詳細は、「NLS_SORT」を参照してください
SQL比較操作を実行すると、文字はそのバイナリ値に基づいて比較されます。バイナリ値が大きい文字は、他の文字より後になります。ほとんどの言語で、バイナリの順序と言語上の順序が一致していないため、一般ユーザーにとってこのような比較は無意味です。意味のある比較をするためには、セッション・パラメータのNLS_COMP
およびNLS_SORT
を使用して、動作を指定できます。この2つのパラメータの設定方法によって、文字の照合と比較に使用するルールが決定されます。
NLS_COMP
の設定によって、SQL操作でNLS_SORT
を処理する方法が決定されます。NLS_COMP
の有効値は次の3つです。
BINARY
SQL照合と比較はすべて、NLS_SORT
に設定された値に関係なく、文字列の文字のバイナリ値に基づいて実行されます。これは、デフォルトの設定です。
LINGUISTIC
SQL照合と比較はすべて、NLS_SORT
で指定された言語ルールに従って実行されます。たとえば、NLS_COMP=LINGUISTIC
およびNLS_SORT=BINARY_CI
の場合、照合依存のSQL操作では、照合と比較にバイナリ値が使用され、文字の大/小文字は無視されることを意味します。
ANSI
NLS_SORT
設定に従うのは、一連の限られたSQL関数です。ANSI
は下位互換性を保つ場合のみ使用できます。通常、言語比較を実行する場合は、NLS_COMP
をLINGUISTIC
に設定する必要があります。
表5-3に、これらの異なる設定を使用した場合のSQLまたはPL/SQL操作の動作の違いを示します。
表5-3 NLS_COMP設定を使用した言語比較の動作
SQLまたはPL/SQL操作 | BINARY | LINGUISTIC | ANSI |
---|---|---|---|
集合演算子 |
- |
- |
- |
|
バイナリ |
|
バイナリ |
スカラー関数 |
- |
- |
- |
|
バイナリ |
|
バイナリ |
|
バイナリ |
|
バイナリ |
|
バイナリ |
|
バイナリ |
|
バイナリ |
|
バイナリ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
バイナリ |
|
バイナリ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
バイナリ |
|
バイナリ |
|
バイナリ |
|
バイナリ |
|
バイナリ |
|
バイナリ |
条件 |
- |
- |
- |
|
バイナリ |
|
|
|
バイナリ |
|
|
|
バイナリ |
|
|
|
バイナリ |
|
バイナリ |
|
|
|
|
CASE式 |
- |
- |
- |
|
バイナリ |
|
バイナリ |
分析関数句 |
- |
- |
- |
|
|
|
|
|
|
|
|
|
|
|
|
副問合せ句 |
- |
- |
- |
|
バイナリ |
|
バイナリ |
|
バイナリ |
|
バイナリ |
|
|
|
|
各パラメータの詳細は、「NLS_COMP」および「NLS_SORT」を参照してください。
比較条件が=、!=、>、<、>=、<=、BETWEEN
、NOT
BETWEEN
、IN
、NOT
IN
の場合、問合せ句ORDER
BY
またはGROUP
BY
、または集計関数COUNT(DISTINCT)
は、NLS_SORT
で指定された言語ルールに従って評価され、比較引数値が照合キーと呼ばれるバイナリ値に最初に変換され、RAW
値のようにバイト単位で比較されます。単一言語照合が適用されると、照合キーには、ソース値の文字のメジャー値とこれらの文字のマイナー値が連結して格納されます。多言語照合が適用されると、照合キーには、1次、2次および3次値が連結されて格納されます。
照合キーは、NLSSORT
関数で戻される値と同じ値になります。つまり、これらのSQL操作の言語動作を有効にすることは、それらの引数をNLSSORT
関数のコールに含めるのと同じです。
照合キーはデータ型がRAW
の値で、RAW
値の最大長は初期化パラメータMAX_STRING_SIZE
の値に応じて変わるため、照合キーの最大長もそのパラメータに従って制御されます。
MAX_STRING_SIZE
がSTANDARD
に設定されている場合は、照合キーの最大長は2000バイトに制限されます。ソース文字列全体から生成される照合キーの長さが最大長を超える場合、この文字列用に生成される照合キーは、値の最大接頭辞(先頭の部分文字列)に合せて計算されるため、計算結果が2000バイトを超えることはありません。単一言語照合では、接頭辞は一般的に1000文字になります。複数言語照合では、接頭辞は一般的に500文字になります。UCA照合では、接頭辞は一般的に300文字になります。接頭辞の正確な長さは、特定の照合およびソース文字列に含まれる特定の文字によって増減する場合があります。照合キーの生成でこの方法を使用すると、照合キーを使用して言語動作を実行するSQL操作で、長い引数の終了部分が無視される場合があります。たとえば、先頭の1000文字が同じで、それ以降の任意の位置の値が異なる2つの文字列は、GROUP
BY
句で一緒にグループ化されます。
MAX_STRING_SIZE
がEXTENDED
に設定されている場合、照合キーの最大長は32767バイトに制限されます。ソース文字列全体から生成される照合キーの長さが最大長を超える場合は、ORA- 12742が呼び出されます。
次に、異なるNLS_COMP
設定を使用した動作の例を示します。
例5-10 バイナリ比較バイナリ照合
次に、バイナリ設定を使用した動作を示します。
SQL> ALTER SESSION SET NLS_COMP=BINARY; SQL> ALTER SESSION SET NLS_SORT=BINARY; SQL> SELECT ename FROM emp1; ENAME ---------------------- Mc Calla MCAfee McCoye Mccathye McCafeé 5 rows selected SQL> SELECT ename FROM emp1 WHERE ename LIKE 'McC%e'; ENAME ---------------------- McCoye 1 row selected
例5-11 言語比較の大/小文字区別なしのバイナリ照合
次に、大/小文字を区別しない設定を使用した動作を示します。
SQL> ALTER SESSION SET NLS_COMP=LINGUISTIC; SQL> ALTER SESSION SET NLS_SORT=BINARY_CI; SQL> SELECT ename FROM emp1 WHERE ename LIKE 'McC%e'; ENAME ---------------------- McCoye Mccathye 2 rows selected
例5-12 言語比較のアクセント区別なしのバイナリ照合
次に、アクセントを区別しない設定を使用した動作を示します。
SQL> ALTER SESSION SET NLS_COMP=LINGUISTIC; SQL> ALTER SESSION SET NLS_SORT=BINARY_AI; SQL> SELECT ename FROM emp1 WHERE ename LIKE 'McC%e'; ENAME ---------------------- McCoye Mccathye McCafeé 3 rows selected
例5-13 戻す行が少なくなる言語比較
一部の操作では、言語ルールを適用すると、戻される行が少なくなる場合があります。たとえば、バイナリ設定の場合、次のようにMcAfee
とMcafee
は異なります。
SQL> ALTER SESSION SET NLS_COMP=BINARY; SQL> ALTER SESSION SET NLS_SORT=BINARY; SQL> SELECT DISTINCT ename FROM emp2; ENAME ---------------------- McAfee Mcafee McCoy 3 rows selected
ただし、大/小文字の区別なし設定の場合、McAfee
とMcafee
は同じです。
SQL> ALTER SESSION SET NLS_COMP=LINGUISTIC; SQL> ALTER SESSION SET NLS_SORT=BINARY_CI; SQL> SELECT DISTINCT ename FROM emp2; ENAME ---------------------- McAfee McCoy 2 rows selected
この例では、McAfee
またはMcafee
のいずれかがDISTINCT
操作で戻される可能性があります。どちらが選択されるかを正確に保証することはできません。
例5-14 XSPANISHを使用した言語比較
バイナリ比較を使用した場合は文字が同じで、言語比較を使用した場合は文字が異なるケースがあります。たとえば、バイナリ設定では、Cindy
、Chad
およびClara
の文字C
は、次のように、同じ文字C
を表します。
SQL> ALTER SESSION SET NLS_COMP=BINARY; SQL> ALTER SESSION SET NLS_SORT=BINARY; SQL> SELECT ename FROM emp3 WHERE ename LIKE 'C%'; ENAME ---------------------- Cindy Chad Clara 3 rows selected
言語ルールが伝統的なスペイン語のXSPANISH
に設定されているデータベース・セッションでは、ch
は、1文字として処理されます。この場合、Chad
の文字c
は、Cindy
やClara
の文字C
とは異なります。
SQL> ALTER SESSION SET NLS_COMP=LINGUISTIC; SQL> ALTER SESSION SET NLS_SORT=XSPANISH; SQL> SELECT ename FROM emp3 WHERE ename LIKE 'C%'; ENAME ---------------------- Cindy Clara 2 rows selected
またch
という組合せの場合の文字c
は、単独の文字c
とは異なります。
SQL> SELECT REPLACE ('character', 'c', 't') "Changes" FROM DUAL; Changes --------------------- charatter
例5-15 UCA0620_TSPANISHを使用した言語比較
文字ch
は、XSPANISH
の場合と同様に、UCA照合の伝統的なスペイン語の順序に従って処理されます。
SQL> ALTER SESSION SET NLS_COMP = LINGUISTIC; SQL> ALTER SESSION SET NLS_SORT = UCA0620_TSPANISH; SQL> SELECT ename FROM emp3 WHERE ename LIKE 'C%'; ENAME -------------- Cindy Clara SQL> SELECT REPLACE ('character', 'c', 't') "Changes" FROM DUAL; Changes ----------- charatter
言語照合は言語固有であるため、バイナリ照合よりもデータ処理が増えます。ASCII文字のバイナリ・コードには文字の順序が反映されているため、言語ASCIIのバイナリ照合を使用すると正確で高速です。複数言語のデータがデータベースに格納されている場合、アプリケーションでは、言語に応じて異なる照合基準に従い、SELECT...ORDER BY
文から戻されたデータを照合できます。このようなソートは、言語索引を使用すると、パフォーマンスを低下させずに実現できます。列の言語索引によって、挿入と更新の操作速度が低下しますが、ORDER
BY
句およびWHERE
を使用した言語照合のパフォーマンスは大幅に向上します。
英語以外の言語を使用する関数索引を作成できます。この索引は、NLS_SORT
で決められている言語照合順序を変更しません。言語索引は単にパフォーマンスを向上させるためのものです。
次の文では、ドイツ語照合に基づいて索引が作成されます。
CREATE TABLE my_table(name VARCHAR(20) NOT NULL); CREATE INDEX nls_index ON my_table (NLSSORT(name, 'NLS_SORT = German'));
CREATE
TABLE
文にNOT
NULL
を指定すると、索引が使用されるようになります。
索引の作成後に、次の例ようなSELECT
文を入力します。
SELECT * FROM my_table WHERE name LIKE 'Hein%' ORDER BY name;
この文は、言語索引を使用しない場合の同じSELECT
文より速く結果が戻されます。
これ以降の内容は、次のとおりです。
関連項目:
ファンクション索引の詳細は、『Oracle Database管理者ガイド』を参照してください
言語索引サポートは、次の照合依存のSQL操作およびSQL機能で使用できます。
比較条件: =
、!=
、>
、<
、>=
、<=
範囲条件: BETWEEN
| NOT
BETWEEN
IN
| NOT
IN
ORDER
BY
GROUP
BY
LIKE
(LIKE
、LIKE2
、LIKE4
、LIKEC
)
DISTINCT
UNIQUE
UNION
INTERSECT
MINUS
次のリストのSQL関数では、言語索引を使用できません。
INSTR
(INSTR
、INSTRB
、INSTR2
、INSTR4
、INSTRC
)
MAX
MIN
REPLACE
TRIM
LTRIM
RTRIM
TRANSLATE
複数言語のデータに言語索引を作成する方法には、次の4通りがあります。
アプリケーションでサポートされている各言語の言語索引を作成します。このアプローチは単純ですが、大量のディスク領域が必要になります。索引ごとに、その索引が作成されている言語以外の言語の複数行が、順番の最後にまとめて照合されます。次の例では、フランス語とドイツ語の言語索引を作成しています。
CREATE INDEX french_index ON employees (NLSSORT(employee_id, 'NLS_SORT=FRENCH')); CREATE INDEX german_index ON employees (NLSSORT(employee_id, 'NLS_SORT=GERMAN'));
使用する索引は、ORDER
BY
句で指定したNLS_SORT
セッション・パラメータまたはNLSSORT
関数の引数によって決定されます。たとえば、NLS_SORT
セッション・パラメータがFRENCH
に設定されている場合、Oracle Databaseではfrench_index
が使用されます。GERMAN
に設定されている場合は、german_index
が使用されます。
すべての言語に対して単一言語索引を作成します。そのためには、NLSSORT
関数のパラメータとして言語列(「例: フランス語の言語索引の設定」のLANG_COL
)を使用する必要があります。この言語列には、索引の作成対象となる列のデータのNLS_LANGUAGE
値が含まれます。次の例では、複数言語に対する単一言語索引を作成しています。の索引では、NLS_LANGUAGE
に対して同じ値を持つ行がまとめてソートされます。
CREATE INDEX i ON t (LANG_COL, NLSSORT(col, 'NLS_SORT=' || LANG_COL));
問合せでは、ORDER BY
句で指定したNLSSORT
関数の引数に基づいて索引が選択されます。
GENERIC_M
やFRENCH_M
などの多言語照合のいずれかを使用して、すべての言語に単一言語索引を作成します。この索引は、ISO 14651に定義されている規則に従って文字をソートします。次に例を示します。
CREATE INDEX i ON t (NLSSORT(col, 'NLS_SORT=GENERIC_M'));
関連項目:
詳細は、「多言語照合」を参照してください
UCA0620_DUCET
やUCA0620_CFRENCH
などのUCA照合のいずれかを使用して、すべての言語に単一言語索引を作成します。これらの索引では、ISO 14654とUCA 6.2.0に準拠した順序で文字がソートされます。次に例を示します。
CREATE INDEX i ON t (NLSSORT(col, 'NLS_SORT=UCA0620_DUCET'));
関連項目:
詳細は、「UCA照合」を参照してください
言語索引を使用するための要件は、次のとおりです。
この項では、次の例についても説明します。
NLS_SORT
パラメータで、言語照合に使用する言語定義を指定する必要があります。たとえば、フランス語の言語照合順序を使用する場合は、NLS_SORT
をFRENCH
に設定する必要があります。たとえば、フランス語の言語照合順序を使用する場合は、NLS_SORT
をGERMAN
に設定する必要があります。
NLS_SORT
を設定するには、複数の方法があります。すべての言語に同じSQL文を使用できるように、NLS_SORT
をクライアントの環境変数として設定する必要があります。クライアント環境でNLS_SORT
を設定すると、様々な言語索引を使用できます。
関連項目:
言語索引を持つ列でORDER BY
column_name
句を使用する必要がある場合は、次の例のようにWHERE
句を含めます。
WHERE NLSSORT(column_name
) IS NOT NULL
列がスキーマ内でNOT NULL
列として定義されていれば、このWHERE
句は必要ありません。
文字値から作成された照合キーの長さは、通常はこの値の数倍です。実際の長さの拡張は、使用する特定の照合およびソース値の内容に応じて異なり、ほとんどがUCAベースの照合により拡張されます。
言語索引を作成する場合、Oracle Databaseは、索引キーを形成する文字の列ごとに、照合キー(NLSSORT
結果)の推定最大サイズを集計して、最初に索引キーの推定最大サイズを計算します。この計算では、最大バイト長n
の文字の列の照合キーの最大サイズは、n*21+5
(UCAベースの照合)およびn*8+10
(その他の照合)と推定されます。
拡大比が大きいと、特にコンポジット(複数列)キーの場合に、最大索引キーのサイズが大きくなる可能性があります。同時に、索引の最大キー・サイズは、索引を含む表領域のブロック・サイズの約70%を超えることはできません。この場合は、ORA-1450エラーがレポートされます。このエラーを回避するには、言語索引を適切なブロック・サイズの表領域に格納してください(データベースのデフォルトのブロック・サイズより大きくなる場合があります)。必要なブロック・サイズ nに対応する初期化パラメータDB_
n
K_CACHE_SIZE
が適切に設定されている場合は、最適なデータベースをCREATE
TABLESPACE
文で作成できます。
関連項目:
Oracle Database管理者ガイド
次の例では、フランス語の言語索引の設定方法を示します。ALTER
SESSION
文を使用するかわりに、NLS_SORT
をクライアントの環境変数として設定することもできます。
ALTER SESSION SET NLS_SORT='FRENCH'; CREATE INDEX test_idx ON test4(NLSSORT(name, 'NLS_SORT=FRENCH')); SELECT * FROM test4 ORDER BY col; ALTER SESSION SET NLS_COMP=LINGUISTIC; SELECT * FROM test4 WHERE name > 'Henri';
注意:
NLS_COMP
がLINGUISTIC
に設定されている場合、SQL関数MAX()
およびMIN()
では、言語索引を使用できません。
検索と照合は関連するタスクです。業務を適切に行うには、言語的に意味のある順序でデータを編成して処理する必要があります。言語的に意味のある方法によるデータの検索と照合は、適用される照合順序に依存します。たとえば、c
より後でf
より前の文字列すべてを検索すると、NLS_SORT
の値に応じて異なる結果が生成されます。ASCIIバイナリ照合では、d
またはe
で始まる文字列が検出されますが、大文字のD
またはE
またはê
のような発音区別記号付きe
などで始まる項目は除外されます。アクセントを区別しないバイナリ照合を適用すると、d
、D
およびÊ
やê
などのアクセント付きe
で始まる文字列がすべて戻されます。NLS_SORT
をXSPANISH
に設定して同じ検索を適用した場合は、ch
で始まる文字列も戻されます。これは、従来のスペイン語ではch
がc
とd
の間を照合する複合文字として扱われるためです。この章では、Oracle Databaseの照合の種類と、各照合がSQLおよびSQL正規表現による文字列検索に与える影響について説明します。
正規表現は、テキスト本体に含まれる文字列のパターンを識別する強力な方法を提供します。正規表現の用途には、San Francisco
のような文字列の単純検索や、すべてのURLを抽出する複雑なタスク、さらに2文字目に母音を含むすべての単語の検索などのタスクがあります。SQLとPL/SQLは、Oracle Databaseの正規表現をサポートしています。
従来の正規表現エンジンは、英語のテキストのみを処理するように設計されていました。ただし、正規表現の実装には、西欧のテキストとはまったく異なる特性を持った多様な言語を含めることができます。Oracle Databaseの正規表現の実装は、Unicode正規表現ガイドラインに基づいています。REGEXP
SQL関数は、データベース・キャラクタ・セットおよび各国語キャラクタ・セットとしてサポートされるキャラクタ・セットをすべて処理します。さらに、Oracle Databaseでは、多言語データの照合に関する固有の言語要件を処理するために、POSIXの正規表現構成メンバーの照合機能が拡張されます。
次の項では、言語依存演算子のOracle拡張について説明します。
関連項目:
正規表現の構文の詳細は、Oracle Database開発ガイドを参照
REGEX
SQL関数の詳細は、『Oracle Database SQL言語リファレンス』を参照してください
POSIX規格では、正規表現での範囲には、現行ロケールの言語定義による範囲の始点から終点までの照合要素がすべて含まれます。したがって、正規表現の範囲はバイト値の範囲ではなく言語上の範囲を意味します。これは、バイト値の範囲はプラットフォームに依存し、エンド・ユーザーが文字のバイト値の順序を知っているとは思われないためです。範囲式のセマンティクスは、キャラクタ・セットから独立させる必要があります。これは、[a-d]
などの範囲には、a
からd
のすべての文字、これらの文字に発音区別記号が付いたもの、伝統的なスペイン語におけるch
のように1文字としてソートされる特殊ケースの照合要素が含まれる可能性があることを意味します。
Oracle Databaseでは、NLS_SORT
パラメータで指定された範囲式が解析され、指定の範囲に含まれる照合要素が判別されます。次に例を示します。
Expression: [a-d]e NLS_SORT: BINARY Does not match: cheremoya NLS_SORT: XSPANISH Matches: >>che<<remoya
この構成メンバーは、照合要素を区切るためにPOSIX規格により導入されています。照合要素とは照合単位であり、ほとんどの場合は1文字に相当します。ただし、言語によっては、照合順序により2文字以上が1つの照合要素として定義される場合があります。従来の正規表現構文では、ユーザーは複数文字による照合要素が関係する範囲を定義できません。たとえば、ch
は2つの異なる文字として解析されるため、a
からch
は範囲として定義できません。
照合要素デリミタ[. .]
を使用すると、複数文字による照合要素と他の要素を区切ることができます。たとえば、範囲a
からch
は、[a-[.ch.]]
として記述できます。また、1文字の照合要素を区切る場合にも使用できます。定義済の照合要素でない複数言語による順序を[. .]
で囲むと、正規表現ではセマンティック・エラーとみなされます。たとえば、ab
が定義済の複数文字による照合要素でない場合、[.ab.]
は無効とみなされます。
英語の正規表現では、範囲式を使用して文字クラスを示すことができます。たとえば、[a-z]
を使用すると任意の小文字を指定できます。ただし、英語以外の正規表現では、その言語の照合順序でa
が最初の小文字でz
が最後の小文字でなければ、このアプローチを使用すると不正確になります。
POSIX規格では、明示的な文字クラスを移植性のある方法で指定できるように、新しい構文要素が導入されています。[: :]
構文は、特定の文字クラスに属しているキャラクタ・セットを示します。文字クラス定義は、キャラクタ・セットの分類データに基づきます。
Oracle Databaseは、POSIX規格で推奨される[= =]
構文を介して同値化クラスもサポートしています。同値化クラスは、ベース文字とそのすべてのアクセント付きバージョンで構成されます。たとえば、同値化クラス[=a=]
は、â
およびä
と一致します。パフォーマンス上の理由で、現行の実装ではUnicodeの複合形式と分解形式の照合はサポートされません。たとえば、ä(a
ウムラウト)は、ウムラウトが続くa
とは一致しません。
次の例に、正規表現の一致を示します。
例5-16 NLS_SORT値を使用した大/小文字を区別しない一致
Oracle Databaseの正規表現の一致では、大/小文字区別の有無は、NLS_SORT
初期化パラメータとランタイム照合オプションの2つのレベルで決定されます。REGEXP
関数は、デフォルトでNLS_SORT
の値から大/小文字区別の動作を継承します。この値は、ランタイム照合オプション'c'
(大小文字区別あり)または'i'
(大/小文字区別なし)で明示的に上書きすることもできます。
Expression:catalog(ue)?
NLS_SORT
:GENERIC_M_CI
Matches:
>>Catalog<<
>>catalogue<<
>>CATALOG<<
Oracle DatabaseのSQL構文は、次のとおりです。
SQL> ALTER SESSION SET NLS_SORT='GENERIC_M_CI'; SQL> SELECT col FROM test WHERE REGEXP_LIKE(col,'catalog(ue)?');
例5-17 ランタイム照合オプションで上書きされた大/小文字区別の有無
Expression:catalog(ue)?
NLS_SORT
:GENERIC_M_CI
Match option:'c'
Matches:
>>catalogue<<
Does not match:
Catalog CATALOG
Oracle DatabaseのSQL構文は、次のとおりです。
SQL> ALTER SESSION SET NLS_SORT='GENERIC_M_CI'; SQL> SELECT col FROM test WHERE REGEXP_LIKE(col,'catalog(ue)?','c');
例5-18 照合要素演算子[..]を使用した照合
Expression: [^-a-[.ch.]]+
/*with NLS_SORT set to xspanish*/
Matches:
>>driver<<
Does not match:
cab
Oracle DatabaseのSQL構文は、次のとおりです。
SQL> SELECT col FROM test WHERE REGEXP_LIKE(col,'[^-a-[.ch.]]+');
例5-19 文字クラス演算子[::]を使用した照合
この式では、小文字6文字からなる文字列が検索されます。アクセント付き文字は、小文字として一致することに注意してください。
Expression: [[:lower:]]{6} Database character set: WE8ISO8859P1 Matches:
>>maître<< >>mòbile<< >>pájaro<< >>zurück<<
Oracle DatabaseのSQL構文は、次のとおりです。
SQL> SELECT col FROM test WHERE REGEXP_LIKE(col,'[[:lower:]]{6}');
例5-20 ベース文字演算子[==]を使用した照合
Expression: r[[=e=]]sum[[=e=]] Matches:
>>resume<< >>résumé<< >>résume<< >>resumé<<
Oracle DatabaseのSQL構文は、次のとおりです。
SQL> SELECT col FROM test WHERE REGEXP_LIKE(col,'r[[=e=]]sum[[=e=]]');
関連項目:
正規表現の構文の詳細は、Oracle Database開発ガイドを参照
REGEX
SQL関数の詳細は、『Oracle Database SQL言語リファレンス』を参照してください