Postgresql
創建新數據庫時不會設置排序規則
我正在嘗試為 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_COLLATE
是en_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 支持的任何排序規則和編碼兼容的數據。