web-dev-qa-db-ja.com

PostgresのICUから照合順序のバージョンを特定します

Postgres 10以降には、テキスト処理やその他の国際化の問題のために International Components for Unicode(ICU) ライブラリが組み込まれています。

分類ルールの進化など、人間の言語に変化が起こります。したがって、照合定義はICUでバージョン管理されます。

➥照合順序のバージョン番号を特定するにはどうすればよいですか?

私は知っています Postgresが報告します 照合バージョンの不一致エラーメッセージの一部としてバージョン番号。エラーメッセージを待つのではなく、積極的にバージョンを照会する方法はありますか?

2
Basil Bourque

TL; DR

pg_collat​​ion_actual_version() 関数を確認してください。

詳細

ALTER COLLATION のPostgreSQLドキュメントでは、この問題について「Notes」セクションで説明されているようです。

ICUライブラリによって提供される照合を使用する場合、照合オブジェクトの作成時に、ICU固有の照合のバージョンがシステムカタログに記録されます。照合が使用されると、現在のバージョンがチェックされます記録されたバージョンに対して、そして不一致があると警告が出されます...

データベースシステムは特定のソート順を持つ格納されたオブジェクトに依存しているため、照合定義の変更により、インデックスの破損やその他の問題が発生する可能性があります。 ...

次のクエリを使用して、現在のデータベースで更新が必要なすべての照合と、それらに依存するオブジェクトを識別できます。

SELECT pg_describe_object(refclassid, refobjid, refobjsubid) AS "Collation",  
       pg_describe_object(classid, objid, objsubid) AS "Object"  
  FROM pg_depend d JOIN pg_collation c  
       ON refclassid = 'pg_collation'::regclass AND refobjid = c.oid  
  WHERE c.collversion <> pg_collation_actual_version(c.oid)  
  ORDER BY 1, 2;

与えられたクエリが pg_collat​​ion_actual_version() 関数を使用していることがわかります。これは次のように定義されています。

pg_collation_actual_versionは、現在オペレーティングシステムにインストールされている照合オブジェクトの実際のバージョンを返します。これがpg_collation.collversionの値と異なる場合、照合に依存するオブジェクトを再構築する必要があります。

2
Solomon Rutzky