我正在尝试为 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
排序规则,通常数据库创建会失败并出现以下错误:这是因为 Postgres 不知道这个
template1
数据库是否包含依赖en_US.UTF-8
字符串排序的对象(主要是索引)。如果它盲目地将其复制到带有C
排序规则的新数据库中,这些索引将被破坏。除了您没有收到该错误消息(这看起来很奇怪)这一事实之外,错误提示部分中的建议是您需要
TEMPLATE 'template0'
的:添加到CREATE DATABASE
.template0
,与 相反template1
,不能填充自定义内容,因此保证仅包含与 Postgres 支持的任何排序规则和编码兼容的数据。