web-dev-qa-db-ja.com

Postgres 10でICU照合順序を `ENCODING`、` LC_COLLATE`、および `LC_CTYPE`として指定します

Postgres 10は、ホストOSの実装に依存するのではなく、 International Components for Unicode(ICU) 照合を使用する機能を獲得します。 Peter Eisentrautによる より堅牢な照合を参照ICU PostgreSQL 10でのサポート

それでは、データベースを作成するときに、どのように正確にICU照合順序を指定しますか?

CREATE DATABASEが新しいデータベースに必要なもの以外のエンコーディングと照合を使用して作成された可能性がある場合、template0ではなくtemplate1を使用するためのtemplate1のヒントを読みました。また、template0を使用する場合は、データ接続を有効にしてデフォルトを上書きする必要があります。

そして、私は Collat​​ion Support についてPostgres 10のドキュメントページを読みました:

und-x-icu(「未定義」の場合)

ICUの「ルート」照合。これを使用して、言語に依存しない合理的な並べ替え順序を取得します。

したがって、多言語のテキストを含む新しいデータベースを確立する場合は、und-x-icuが適切な値になると思われます。特定の言語が特定の言語に焦点を当てていることがわかっている場合、SELECTコマンドはドイツ語のde-x-icuなどの別の照合を指定できます。それ以外の場合は、デフォルトのund-x-icuにフォールバックします。

そこで、Postgres 10 Beta 2でデータベースを作成するために次のSQLを試しました。

CREATE DATABASE timepiece_
TEMPLATE 'template0'
ALLOW_CONNECTIONS TRUE
CONNECTION LIMIT -1
ENCODING 'UTF8'
LC_COLLATE 'und-x-icu'
LC_CTYPE 'und-x-icu'
;

エラーで失敗します:

[42809]エラー:無効なロケール名:「und-x-icu」

そのため、旧式の照合構文のドキュメントにあるように、追加された.utf8を使用しました。

CREATE DATABASE timepiece_
TEMPLATE 'template0'
ALLOW_CONNECTIONS TRUE
CONNECTION LIMIT -1
ENCODING 'UTF8'
LC_COLLATE 'und-x-icu.utf8'
LC_CTYPE 'und-x-icu.utf8'
;

まったく同じ失敗:

[42809]エラー:無効なロケール名:「und-x-icu.utf8」

私のPostgresクラスタはICUライブラリで構築されましたか?これは pg_config を呼び出した結果です。最後の行は'ICU_LIBS=-L/opt/local/Current/lib -licuuc -licudata -licui18n'です。私のビルドにはICUライブラリが含まれていますが、よくわかりません。

/ライブラリ/ PostgreSQL/10Beta2/bin/pg_config --configure

'--with-icu' '--prefix =/mnt/hgfs/pginstaller.pune/server/staging_cache/osx' '--with-ldap' '--with-openssl' '--with-Perl' '- -with-python '' --with-tcl '' --with-bonjour '' --with-pam '' --enable-thread-safety '' --with-libxml '' --with-uuid = e2fs '' --with-includes =/opt/local/Current/include/libxml2:/ opt/local/Current/include:/ opt/local/Current/include/security '' --docdir =/mnt/hgfs/pginstaller .pune/server/staging_cache/osx/doc/postgresql '' --with-libxslt '' --with-libedit-preferred '' --with-gssapi '' CFLAGS = -isysroot /Applications/Xcode.app/Contents/ Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk -mmacosx-version-min = 10.8 -Arch i386 -Arch x86_64 -O2 '' LDFLAGS = -L/opt/local/Current/lib '' ICU_CFLAGS = -I/opt/local/Current/include '' ICU_LIBS = -L/opt/local/Current/lib -licuuc -licudata -licui18n '

new新しいICU照合順序を使用するには、ENCODINGLC_COLLATE、およびLC_TYPEをどのように指定しますか?

English英語指向のデータベースにどのようなICU照合名を提案するか?西ヨーロッパの多言語データベースの場合?

possible可能なICU照合名は何ですか?

4
Basil Bourque

最初に、この回答の時点では、PostgreSQL 10はまだベータ段階にあることに注意してください。 ICUの統合に関するいくつかの問題とそのドキュメント化の方法はまだ議論中であり、GAのリリース前に変更が加えられる可能性があります。

EN新しいICU照合を使用するために、ENCODING、LC_COLLATE、およびLC_TYPEをどのように指定しますか?

現在は不可能です(おそらく十分に文書化されていないか、エラーメッセージで十分に明確にされていません:無効なロケール名と表示されている場合は、 libcによって提供されるロケールのセット。
これは、開発者メーリングリストのこのスレッドで説明されています。 ICUは、データベースのデフォルトのソート順に使用できますか?

English英語指向のデータベースにどのICU照合名を提案しますか?西ヨーロッパの多言語データベースについては?

特定の並べ替え要件がある場合は、ほとんどの場合問題になります。メーリングリストの他のスレッドでは:
Postgres 10でユーザーがカスタムICU照合で実行できること
いくつかの具体的な例は、libcができることと比較して特別に動作するICU照合の例です。

特定の要件がない場合、移植性を除いて、ほとんどのアプリケーションはICU照合とlibc en_US照合のどちらを使用してもかまいません。 ICUの大きなポイントの1つは、特定のロケールのすべてのオペレーティングシステムでまったく同じ順序を取得することです。これは、実際にはlibcの場合とは異なります。事前に作成されたen-x-icuは一般的な英語では問題ないと思いますが、西ヨーロッパ言語では、どの照合順序がund-x-icuよりも優れているのかわかりません。

付記として、並べ替え規則をあまり気にしない場合、Cはどの言語よりも優れているため、C以外の照合順序を使用することはお勧めできません。認識照合。また、Cはオペレーティングシステム間で移植可能です。

possible可能なICU照合名は何ですか?

initdbpg_collationに事前定義された照合のリストを入力しますが、リストのようにICU照合名がタグを組み立てることによって形成されるため、完全なリストは組み合わせの爆発の影響を受けます。ここ: http://unicode.org/reports/tr35/tr35-collat​​ion.html#Setting_Options

現在、このドキュメントでは、次のことができると明記されていません。

CREATE COLLATION mycoll (locale='my-set-of-tags', provider='icu');

しかし、ドキュメントでそれを改善するための作業が現在行われていると思います。

指摘する価値のあるもう1つの問題は、複数のICUメジャーバージョンが存在し、initdbがインスタンス化する定義済みの照合順序のリストがこれらのバージョン間で大幅に異なることです。特にICU 53より前と53以降。これは別の議論で証拠に記載されています: いくつかのICU-52(debian8)COLLATEとwork_mem値のクラッシュレポート

編集:次のベータ版またはRCでは、initdbによって作成されたICU照合順序のリストは、この ディスカッション で説明されているように、完全に変更されます。リストは、照合ではなくICUロケールで反復することによって作成され、その結果、質問「可能なICU照合名は何ですか?」 は、新しい値で再検討する必要があります。

3
Daniel Vérité