Postgresql

在 Postgres 中辨識來自 ICU 的排序規則的版本

  • August 5, 2019

Postgres 10 及更高版本合併了國際 Unicode 組件 (ICU)庫,用於文本處理和其他國際化問題。

人類語言會發生變化,例如排序規則的演變。因此,排序規則定義在 ICU 中進行版本控制。

➥ 如何辨識排序規則的版本號?

我知道Postgres 將報告版本號作為排序規則版本不匹配錯誤消息的一部分。有沒有辦法主動查詢版本而不是等待錯誤消息?

TL; 博士

查看pg_collat​​ion_actual_version()函式。

 

細節

ALTER COLLATION的 PostgreSQL 文件似乎在“註釋”部分討論了這個問題:

當使用 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,則可能需要重建取決於排序規則的對象。

引用自:https://dba.stackexchange.com/questions/244491