★PostgreSQLカンファレンス2024 12月6日開催/チケット販売中★
他のバージョンの文書 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

24.2. 照合順序サポート #

照合順序機能は、ソート順番と列ごともしくは操作ごとのデータの文字区別の振る舞いを指定することを可能にします。 これにより、作成後のデータベースのLC_COLLATELC_CTYPEの設定を変更できない制限が緩和されます。

24.2.1. 概念 #

概念的に照合可能なデータ型のそれぞれの式は、照合順序を保持しています (組み込みの照合可能なデータ型はtextvarcharcharです。 ユーザ定義の基本型は照合可能とマーキングできます。もちろん照合可能なデータ型上のドメインは照合可能となります)。 もし、式が列参照である場合は、式の照合順序は列の定義された照合順序となります。 もし、式が定数である場合は、照合順序は定数のデータ型のデフォルトの照合順序となります。 より複雑な式の照合順序は、下記に示すように、その入力の照合順序から引き出されます。

式の照合順序は、default照合順序となります。これはデータベースに対して定義されたロケール設定を意味しています。 式の照合順序は非決定となることもあります。そのような場合に、照合順序が必要となるような順序操作や他の操作は失敗するでしょう。

データベースシステムが並べ替えや文字区別を行う場合、データベースは入力の照合順序を使用します。 これは、たとえばORDER BY句や < 演算子や関数を使用する際に発生します。 ORDER BY句に適用する照合順序は、単純にソートキーの照合順序です。 関数や演算子の呼び出しに対して適用される照合順序は、以下に述べるように引数により決まります。 比較演算子に加えて、照合順序はlowerupperinitcapといった小文字と大文字を変換する関数やパターンマッチングの演算子、to_char関連の関数で考慮されています。

関数や演算子の呼び出しに対して、引数の照合順序検査により得られた照合順序は実行時に特定の操作を行うために使用されます。 もし関数や演算子の呼び出しの結果が照合順序可能なデータ型であった場合、照合順序は関数もしくは演算子式の定義済みの照合順序として 解析時にも試用されます。このとき照合順序の知識が必要となるような囲み式があります。

式の照合順序の導出は暗黙でも明示的にでも可能です。 この区別は、複数の異なる照合順序が式中に現れるときに照合順序がどのように組み合わされるか、に影響を与えます。 明示的な照合順序の導出は、COLLATE句が使用されたときに発生します。 他の全ての照合順序は暗黙となります。例えば関数呼び出しの中では、次の規則が用いられます。

  1. 入力式に明示的な照合順序の導出がある場合、入力式の中の明示的に導出された全ての照合順序が同一でなくてはなりません。 そうでない場合はエラーが発生します。もし明示的に導出された照合順序がある場合は、それは照合順序の組み合わせの結果となります。

  2. そうでない場合は、全ての入力式は同一の暗黙の照合順序の導出またはデフォルトの照合順序を持たなくてはなりません。 もしデフォルトではない照合順序がある場合は、それは照合順序の組み合わせの結果となります。 もしそうでない場合は、結果はデフォルトの照合順序となります。

  3. 入力式内でデフォルトではない暗黙の照合順序が衝突している場合、決定不能な照合順序であるとみなされます。 これは、もし呼び出された特定の関数が適用するべき照合順序を知っておく必要がないかぎりエラーの条件ではありません。 もし知っておく必要がある場合は、実行時にエラーとなります。

例えば、このテーブル定義を考えてみます。

CREATE TABLE test1 (
    a text COLLATE "de_DE",
    b text COLLATE "es_ES",
    ...
);

このとき

SELECT a < 'foo' FROM test1;

< の比較はde_DEの規則により実行されます。 というのも式は暗黙的に導出されたデフォルトの照合順序と組み合わせます。しかし、

SELECT a < ('foo' COLLATE "fr_FR") FROM test1;

このとき比較は、明示的な照合順序の導出は暗黙の照合順序をオーバーライドするためfr_FR規則が用いられます。 さらに、次の例では

SELECT a < b FROM test1;

パーサはどの照合順序を適用するか決定できません。というのもab列は暗黙の衝突する照合順序を持つためです。 < 演算子がどちらの照合順序を使用するか知る必要があるため、エラーとなります。 このエラーは、どちらかの入力式に明示的な照合順序の指定を付加することで解決できます。 つまり、以下のようになります。

SELECT a < b COLLATE "de_DE" FROM test1;

もしくは以下でも同じです。

SELECT a COLLATE "de_DE" < b FROM test1;

一方で、以下のように構造的に似たケースとして

SELECT a || b FROM test1;

これはエラーとなりません。というのも || 演算子は、照合順序には関係がないためです。 この結果は照合順序と関係なく同じになります。

もし関数や演算子が照合順序可能なデータ型の結果を出力する場合は、関数に割り当てられた照合順序、もしくは演算子の組み合わされた入力式は、関数もしくは演算子の結果に対しても 適用されると考えられます。よって、以下の例では

SELECT * FROM test1 ORDER BY a || 'foo';

順序はde_DE規則に基づき実行されますが、以下の問い合わせでは

SELECT * FROM test1 ORDER BY a || b;

エラーとなります。というのも || 演算子が照合順序を知る必要がなかったとしても ORDER BY句が照合順序を知る必要があるためです。 以前と同様、この衝突は明示的に照合順序を指定することにより解決できます。

SELECT * FROM test1 ORDER BY a || b COLLATE "fr_FR";

24.2.2. 照合順序の管理 #

照合順序は、SQL名称を、オペレーティングシステム中にインストールされたライブラリによって提供されるロケールにマッピングするSQLスキーマオブジェクトです。 照合順序の定義には、ロケールデータを提供するライブラリを指定するプロバイダ(provider)が含まれます。 標準プロバイダの一つはlibcで、オペレーティングシステムのCライブラリが提供するロケールを使用します。 オペレーティングシステムが提供するほとんどのツールが、このロケールを使用します。 他のプロバイダとしてはicuがあり、外部のICUライブラリを使います。 ICUロケールは、PostgreSQLがビルドされた際にICUサポートが設定されていた場合にのみ利用可能です。

libcが提供する照合順序は、setlocale()システムライブラリの呼び出しが許可するLC_COLLATELC_CTYPEの組み合わせ設定にマッピングします。 (名称から推測されるように、照合順序の主な目的はソート順序を制御するLC_COLLATEを設定することです。 しかし実際にはLC_CTYPEの設定をLC_COLLATEと異なるようにする必要はほとんどありません。 そのため、式ごとにLC_CTYPEを設定するような別の機構を作成するより、これらの設定を収集する方が、より便利です。) また、libcの照合順序は文字エンコーディングと結びついています(24.3を参照してください)。 同一の照合順序名称が異なるエンコーディングに対して存在しています。

icuが提供する照合順序オブジェクトは、ICUライブラリが提供する照合順序機能(collator)にマップします。 ICUはcollatectypeを別々に設定する機能を提供しないので、それら常に同じものになります。 また、ICUの照合順序はエンコーディングからは独立しています。 ですから、データベース中のある名前のICU照合順序は、常にただひとつだけです。

24.2.2.1. 標準の照合順序 #

すべてのプラットフォーム上でdefaultCそしてPOSIXという名称の照合順序が 利用できます。 オペレーティングシステムによっては追加の照合順序が利用可能な場合もあります。 default照合順序は、データベース作成時にLC_COLLATE値とLC_CTYPE値を 選択します。CPOSIX照合順序は共にtraditional Cの動作を指定します。 これはASCII文字のAからZを文字として扱い、ソート順は厳密な文字コードのバイト値によります。

注記

CロケールとPOSIXロケールは、データベースエンコーディングによって動作が異なる場合があります。

さらに、次の2つのSQL標準照合順序名を使用できます。

unicode

この照合順序は、デフォルトUnicode照合基本テーブルを使用してUnicode照合アルゴリズムで並べ替えます。 すべてのエンコーディングで使用できます。 この照合順序を使用するにはICUサポートが必要です。 (この照合順序は、ICU rootロケールと同じ動作をします。 und-x-icu (undefined用)を参照してください。)

ucs_basic

この照合順序はUnicodeコードポイントで並べ替えます。 エンコーディングUTF8でのみ使用できます。 (この照合順序は、UTF8エンコーディングのlibcロケール指定Cと同じ動作をします。)

24.2.2.2. 定義済みの照合順序 #

オペレーティングシステムが単一のプログラム内(newlocaleや関連する関数)で複数のロケールを使用することをサポートしているか、ICUサポートが組み込み済みの場合、データベースクラスタが初期化されるとinitdbは、オペレーティングシステム上で見つけた全てのロケールに基づく照合順序をシステムカタログのpg_collationに書き込みます。

現在利用可能なロケールを調べるには、SELECT * FROM pg_collationという問合せを使うか、psql内で\dOS+コマンドを使用します。

24.2.2.2.1. libc照合順序 #

例えば、オペレーティングシステムがde_DE.utf8という名称のロケールを提供するとします。 initdbは、de_DE.utf8に設定されたLC_COLLATELC_CTYPEの両方を持つUTF8エンコーディングのde_DE.utf8という名称の照合順序を作成します。 同時に照合順序の名称から.utf8タグを削除した照合順序も作成します。 そのため、de_DEという名前の照合を使用することもできます。 これは手間を省き、名称がエンコーディングに依存しにくいようになります。 それにもかかわらず、照合順序名称の初期値はプラットフォーム依存となることに気をつけてください。

libcが提供するデフォルトの照合順序の集合は、直接オペレーティングシステム内にインストールされたロケールにマップされ、コマンドlocale -aで参照できます。 LC_COLLATELC_CTYPEで違う値を持つlibc照合順序が必要な場合、あるいはデータベースシステムが初期化された後に新しいロケールがインストールされた場合は、新しい照合順序をCREATE COLLATIONコマンドで作成できます。 また、新しいオペレーティングシステムロケールは、pg_import_system_collations()関数でインポートできます。

どのようなデータベース内でも、データベースのエンコーディングを使用している照合順序のみが興味の対象となります。 pg_collation内の他のエントリは無視されます。 よってde_DEといったようなエンコーディング名が省かれた照合順序は、一般的には一意でなくてもデータベース内では一意であるとみなされます。 エンコーディング名が省かれた照合順序を使用することを推奨します。 というのも、データベースのエンコーディングを変更するときに、変えなければならないものを1つ減らせるからです。 しかし、defaultCそしてPOSIX照合順序は、データベースのエンコーディングに関係なく使用可能であることに注意してください。

PostgreSQLは、異なる照合順序オブジェクトは、それらが同じプロパティを持っていても互換性がないものとみなします。 例えば、

SELECT a COLLATE "C" < b COLLATE "POSIX" FROM test1;

は、CPOSIX照合順序が同じ動作であってもエラーとなります。 よってエンコーディング名が省かれた照合順序を混ぜて使用することは推奨されません。

24.2.2.2.2. ICU照合順序 #

ICUにおいては、すべての可能なロケール名を列挙するのは賢明ではありません。 ICUはロケールの固有の名前付けシステムを使っています。 しかし、実際の個別のロケール名以上の名前を付ける多くの方法があります。 initdbはICUのAPIを使い、照合順序の初期集合を入力するための 個別のロケールの集合を取り出します。 ICUが提供する照合順序は、libcロケールと区別するために、SQL環境において、私的利用拡張-x-icuを追加したBCP 47言語タグ形式の名前で作成されます。

以下は作成されるかもしれない照合順序の例です。

de-x-icu #

ドイツ語照合順序、デフォルトの異型

de-AT-x-icu #

オーストリアのドイツ語照合順序、デフォルトの異型

(他に、de-DE-x-icuあるいはde-CH-x-icuというのがあります。 しかし、本稿執筆時点では、それらはde-x-icuと同じです。)

und-x-icu (undefined用) #

ICUroot照合順序。 言語に依存しない適当なソート順を得るために使用してください。

ある種の(利用頻度が低い)エンコーディングをICUはサポートしません。 データベースエンコーディングがこのようなものであった場合、pg_collation中のICU照合順序は無視されます。 このようなものを使おうとすると、collation "de-x-icu" for encoding "WIN874" does not existというメッセージを伴ったエラーが発生します。

24.2.2.3. 新しい照合順序オブジェクトの作成 #

標準の定義済み照合順序が十分でない場合は、ユーザはSQLコマンドCREATE COLLATIONで照合順序オブジェクトを作成できます。

すべての定義済みオブジェクト同様、標準の定義済み照合順序はpg_catalogスキーマにあります。 ユーザ定義の照合順序はユーザのスキーマに作成するべきです。 これはまた、pg_dumpの保存対象になることを確実にします。

24.2.2.3.1. libc照合順序 #

以下のようにして新しいlibc照合順序を作成できます。

CREATE COLLATION german (provider = libc, locale = 'de_DE');

コマンド中のlocale句に使用できる正確な値は、オペレーティングシステムに依存します。 Unix系のシステムでは、locale -aコマンドでこのリストを表示できるでしょう。

定義済みのlibc照合順序は、データベースインスタンスが初期化された際に、オペレーティングシステムで定義されたすべての照合順序をすでに含んでいるので、新しいものを手動で作る必要はあまりないでしょう。 そうしたことをする理由があるとすれば、異なる命名規則が必要である(この場合は、24.2.2.3.3も参照してください)、あるいはオペレーティングシステムが更新されて、新しいロケールの定義が提供されるようになった場合です。(この場合はpg_import_system_collations()も参照してください。)

24.2.2.3.2. ICU照合順序 #

ICU照合順序は次のように作成できます。

CREATE COLLATION german (provider = icu, locale = 'de-DE');

ICUロケールはBCP 47言語タグとして指定されますが、ほとんどのlibcスタイルのロケール名も受け入れます。 可能な場合、libcスタイルのロケール名は言語タグに変換されます。

新しいカスタマイズICU照合順序では、照合順序タグに照合順序属性を含めることで、言語の動作を広範囲にICU化できます。 詳細と例については、24.2.3を参照してください。

24.2.2.3.3. 照合順序の複製 #

コマンドCREATE COLLATIONは、既存の照合順序から新しい照合順序を作る際にも利用できます。 これは、オペレーティングシステムから独立した照合順序名をアプリケーションで使用可能にしたり、互換性のある名称を作成したり、ICUが提供する照合順序を、よりわかりやすい名称で利用するのに役立ちます。 例を示します。

CREATE COLLATION german FROM "de_DE";
CREATE COLLATION french FROM "fr-x-icu";

24.2.2.4. 非決定論的な照合順序 #

照合順序は決定論的もしくは非決定論的のどちらかです。 決定論的な照合順序は決定論的な比較を使用します。 つまり、同じバイト列で構成される場合に限り等しい文字列とみなします。 非決定論的な比較は、異なるバイト値で構成される文字列の場合でさえ文字列が等しいと判定するかもしれません。 一般的な状況では、大文字小文字を区別しない比較、アクセントを区別しない比較および異なるUnicode正規化形式による文字列の比較が含まれます。 このような区別しない比較を実際に実装するかは照合順序のプロバイダ次第です。 deterministicフラグはバイト単位の比較を用いて分解されるかどうかのみを決定します。 用語の詳細については、Unicode Technical Standard 10を参照してください。

非決定論的な照合順序を作るためにはCREATE COLLATIONdeterministic = falseプロパティを指定します。 以下に例を示します。

CREATE COLLATION ndcoll (provider = icu, locale = 'und', deterministic = false);

この例では非決定論的な方法で標準のUnicode照合順序を使えます。 具体的には、これは異なる正規形の文字列を正しく比較できるでしょう。 より興味深い例は上述したICUカスタマイズ機能を用いた場合です。 以下に例を示します。

CREATE COLLATION case_insensitive (provider = icu, locale = 'und-u-ks-level2', deterministic = false);
CREATE COLLATION ignore_accents (provider = icu, locale = 'und-u-ks-level1-kc-true', deterministic = false);

すべての標準および事前に定義された照合順序は決定論的であり、すべてのユーザ定義の照合順序はデフォルトで決定論的です。 特にUnicodeの全機能およびその特別な場合を考えた際、非決定論的な照合順序はより多くの正しい振る舞いを与えると同時に、いくつかの欠点もあります。 第一にそれらを使用するとパフォーマンスが低下します。 B-treeは非決定的照合順序を使用したインデックスでは重複排除には使用できないことに特に注意してください。 また、パターンマッチング操作などで非決定論的な照合順序による操作ができないことも避けられません。 したがって、これらは明確に必要とされる場合のみに使用されるべきです。

ヒント

異なるUnicode正規化形式のテキストを処理する場合、非決定論的な照合を使用する代わりにnormalizeおよびis normalized関数もしくは式を使用して文字列の前処理もしくはチェックをするオプションもあります。 それぞれのアプローチで異なるトレードオフがあります。

24.2.3. ICU照合順序カスタム #

ICUは、言語タグの一部として照合順序設定を持つ新しい照合順序を定義することで、照合順序の動作を広範囲に制御することができます。 これらの設定は、さまざまなニーズに合わせて照合順序順序を変更できます。 インスタンスの場合:

-- ignore differences in accents and case
CREATE COLLATION ignore_accent_case (provider = icu, deterministic = false, locale = 'und-u-ks-level1');
SELECT 'Å' = 'A' COLLATE ignore_accent_case; -- true
SELECT 'z' = 'Z' COLLATE ignore_accent_case; -- true

-- upper case letters sort before lower case.
CREATE COLLATION upper_first (provider = icu, locale = 'und-u-kf-upper');
SELECT 'B' < 'b' COLLATE upper_first; -- true

-- treat digits numerically and ignore punctuation
CREATE COLLATION num_ignore_punct (provider = icu, deterministic = false, locale = 'und-u-ka-shifted-kn');
SELECT 'id-45' < 'id-123' COLLATE num_ignore_punct; -- true
SELECT 'w;x*y-z' = 'wxyz' COLLATE num_ignore_punct; -- true

利用可能なオプションの多くは24.2.3.2で説明されています。 詳細は24.2.3.5を参照してください。

24.2.3.1. ICU比較レベル #

ICUでの2つの文字列の比較(照合)は、テキストの特徴が「レベル」にグループ化される多段階プロセスによって決定されます。 各レベルの処理は、照合設定によって制御されます。 高いレベルは、より細かいテキストの特徴に対応します。

表 24.1は、指定されたレベルで等しいかどうかを決定する際に重要とされるテキスト特徴の違いを示しています。 Unicode文字U+2063は不可視のセパレータであり、表に示されているように、identic未満のすべての比較レベルで無視されます。

表24.1 ICU照合順序レベル

レベル説明'f' = 'f''ab' = U&'a\2063b''x-y' = 'x_y''g' = 'G''n' = 'ñ''y' = 'z'
level1基本文字truetruetruetruetruefalse
level2アクセントtruetruetruetruefalsefalse
level3大文字小文字/異型truetruetruefalsefalsefalse
level4句読点truetruefalsefalsefalsefalse
identicすべてtruefalsefalsefalsefalsefalse

すべてのレベルで、完全正規化が無効であっても基本正規化は行われます。 例の場合、'á'はコードポイントU&'\0061\0301'または単一コードポイントU&'\00E1'で構成され、これらのシーケンスはidenticレベルでも等しいとみなされます。 コードポイント表現形式内の差を個別として扱うには、deterministictrueに設定して作成された照合順序を使用します。

24.2.3.1.1. 照合順序レベルの例 #
CREATE COLLATION level3 (provider = icu, deterministic = false, locale = 'und-u-ka-shifted-ks-level3');
CREATE COLLATION level4 (provider = icu, deterministic = false, locale = 'und-u-ka-shifted-ks-level4');
CREATE COLLATION identic (provider = icu, deterministic = false, locale = 'und-u-ka-shifted-ks-identic');

-- invisible separator ignored at all levels except identic
SELECT 'ab' = U&'a\2063b' COLLATE level4; -- true
SELECT 'ab' = U&'a\2063b' COLLATE identic; -- false

-- punctuation ignored at level3 but not at level 4
SELECT 'x-y' = 'x_y' COLLATE level3; -- true
SELECT 'x-y' = 'x_y' COLLATE level4; -- false

24.2.3.2. ICUロケールの照合順序設定 #

表 24.2には、利用可能な照合順序設定が表示されます。 これらは言語タグの一部として使用して照合順序をカスタマイズすることができます。

表24.2 ICU照合順序設定

キーデフォルト説明
coemoji, phonebk, standard, ...standard 照合順序タイプ。追加のオプションと詳細については24.2.3.5を参照してください。
kanoignore, shiftednoignore shiftedに設定されている場合、いくつかの文字(例:句読点やスペース)が比較で無視されるようになります。 効果を発揮するには、キーkslevel3以下に設定する必要があります。 どの文字クラスが無視されるかを制御するためにキーkvを設定します。
kbtrue, falsefalse レベル2の差異の逆比較。 例えば、ロケールund-u-kb'àe''aé'よりも前に並べます。
kctrue, falsefalse

大文字小文字をアクセントと他のレベル3の特徴の間に「レベル2.5」として分離します。

trueに設定されており、kslevel1に設定されている場合、アクセントを無視しますが、大文字小文字を考慮します。

kf upper, lower, false false upperに設定されている場合、大文字が小文字よりも前に並べられます。 lowerに設定されている場合、小文字が大文字よりも前に並べられます。 falseに設定されている場合、並べ替えはロケールの規則に依存します。
kntrue, falsefalse trueに設定されている場合、文字列内の数字は、数字のシーケンスではなく単一の数値として扱われます。 例えば、'id-45''id-123'よりも前に並べられます。
kktrue, falsefalse

完全正規化を有効にします。 パフォーマンスに影響する場合があります。 基本正規化は、falseに設定されている場合でも実行されます。 完全正規化を必要とする言語のロケールでは、通常、デフォルトによって有効にされます。

複数のアクセントが単一の文字に適用される場合など、完全正規化が重要な場合があります。 例えば、コードポイントシーケンスU&'\0065\0323\0302'U&'\0065\0302\0323'は、異なる順序で適用されたサーカムフレックスと下ドットのアクセントを持つeを表します。 完全正規化が有効の場合、これらのコードポイントシーケンスは等しいものとして扱われます。 それ以外の場合は等しくありません。

kr space, punct, symbol, currency, digit, script-id  

1つ以上の有効な値、または任意のBCP 47script-idに設定します。 たとえば、latn("ラテン")またはgrek("ギリシャ")です。 複数の値は"-"で区切ります。

文字クラスの順序を再定義します。 リストの後の文字クラスに属する文字は、リストの後の文字クラスに属する文字よりも前に並べられます。 たとえば、値digit-currency-space(言語タグの一部としてund-u-kr-digit-currency-space)は、句読点を数字とスペースの前に並べます。

kslevel1, level2, level3, level4, identiclevel3 等価性を決定する際の感度(または「強度」)で、level1は差異に対して最も感度が低く、identicは差異に対して最も感度が高いです。 詳細は表 24.1を参照してください。
kv space, punct, symbol, currency punct レベル3での比較中に無視される文字クラス。 後の値に設定すると、前の値も含まれます。 たとえば、symbolpunctおよびspaceも含みます。 無視される文字を含む文字にキーkashiftedに設定し、キーkslevel3以下に設定する必要があります。

デフォルトはロケールによって異なります。 上記のテーブルは完全なものではありません。 追加のオプションと詳細については24.2.3.5を参照してください。

注記

多くの照合順序設定では、目的の効果を得るために、deterministicfalseに設定した照合順序を作成する必要があります(24.2.2.4を参照)。 また、キーkashiftedに設定されている場合にのみ有効になる設定もあります(表 24.2を参照)。

24.2.3.3. 照合順序設定の例 #

CREATE COLLATION "de-u-co-phonebk-x-icu" (provider = icu, locale = 'de-u-co-phonebk'); #

電話帳照合順形式を伴うドイツ語の照合順序

CREATE COLLATION "und-u-co-emoji-x-icu" (provider = icu, locale = 'und-u-co-emoji'); #

絵文字照合順序型を伴うroot照合順序。Unicode Technical Standard #51による。

CREATE COLLATION latinlast (provider = icu, locale = 'en-u-kr-grek-latn'); #

ラテン文字の前にギリシャ文字が来るように並べます。(デフォルトではギリシャ文字の前にラテン文字が来ます。)

CREATE COLLATION upperfirst (provider = icu, locale = 'en-u-kf-upper'); #

小文字の前に大文字が来るように並べます。(デフォルトでは最初に小文字が来ます。)

CREATE COLLATION special (provider = icu, locale = 'en-u-kf-upper-kr-grek-latn'); #

上記のオプションを組み合わせます。

24.2.3.4. ICU適合化規則 #

上記のオプション設定によって提供される照合順序が十分でない場合は、照合順序要素のオーダーを適合化規則を使用して変更できます。 適合化規則の構文はで詳しく説明されています。

この小さな例は、rootロケールをベースにした照合順序を作成し、ルールを調整します。

CREATE COLLATION custom (provider = icu, locale = 'und', rules = '&V << w <<< W');

このルールでは、文字WVの後にソートされますが、アクセントと同様に二次的な差として扱われます。 このようなルールは、一部の言語のロケール定義に含まれています。 (もちろん、ロケール定義がすでに目的のルールを包含している場合は、明示的に再指定する必要はありません。)

ここに、より複雑な例があります。 次のステートメントは、EBCDIC記名的のオーダーにUS-ASCII文字をソートするためのルールを使用して、照合順序エンコーディングebcdicを設定します。

CREATE COLLATION ebcdic (provider = icu, locale = 'und',
rules = $$
& ' ' < '.' < '<' < '(' < '+' < \|
< '&' < '!' < '$' < '*' < ')' < ';'
< '-' < '/' < ',' < '%' < '_' < '>' < '?'
< '`' < ':' < '#' < '@' < \' < '=' < '"'
<*a-r < '~' <*s-z < '^' < '[' < ']'
< '{' <*A-I < '}' <*J-R < '\' <*S-Z <*0-9
$$);

SELECT c
FROM (VALUES ('a'), ('b'), ('A'), ('B'), ('1'), ('2'), ('!'), ('^')) AS x(c)
ORDER BY c COLLATE ebcdic;
 c
---
 !
 a
 b
 ^
 A
 B
 1
 2

24.2.3.5. ICUの外部参照 #

この節(24.2.3)は、概要の動作と言語タグの簡単なオプションです。 技術的な詳細、追加のICU、および新しい動作については、次のドキュメントを参照してください。