Postgresql

創建新數據庫時不會設置排序規則

  • April 18, 2022

我正在嘗試為 PostgreSQL 13 中的新數據庫設置排序規則,但它似乎沒有生效:

postgres=# CREATE DATABASE assets ENCODING 'UTF8' LC_COLLATE 'C' LC_CTYPE 'en_US.UTF-8';
CREATE DATABASE
postgres=# \l
                                     List of databases
  Name    |  Owner   | Encoding |   Collate   |    Ctype    |   Access privileges   
-----------+----------+----------+-------------+-------------+-----------------------
assets    | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
postgres  | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
template0 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
          |          |          |             |             | postgres=CTc/postgres
template1 | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres          +
          |          |          |             |             | postgres=CTc/postgres
(4 rows)

如何讓新數據庫反映我的排序規則更改?

問題中的CREATE DATABASE語句將從 複製新數據庫 template1,預設模板數據庫LC_COLLATEen_US.UTF-8。由於新數據庫需要C排序規則,通常數據庫創建會失敗並出現以下錯誤:

CREATE DATABASE assets ENCODING 'UTF8' LC_COLLATE 'C' LC_CTYPE 'en_US.UTF-8';

ERROR:  new collation (C) is incompatible with the collation of the template database (en_US.UTF-8)
HINT:  Use the same collation as in the template database, or use template0 as template.

這是因為 Postgres 不知道這個template1數據庫是否包含依賴en_US.UTF-8字元串排序的對象(主要是索引)。如果它盲目地將其複製到帶有C排序規則的新數據庫中,這些索引將被破壞。

除了您沒有收到該錯誤消息(這看起來很奇怪)這一事實之外,錯誤提示部分中的建議是您需要**TEMPLATE 'template0'**的:添加到CREATE DATABASE. template0,與 相反template1,不能填充自定義內容,因此保證僅包含與 Postgres 支持的任何排序規則和編碼兼容的數據。

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