我希望通过以下方式构建新的postgreSQL数据库:
CREATE DATABASE newdb
WITH OWNER = postgres
ENCODING = 'UTF8'
TABLESPACE = pg_default
LC_COLLATE = 'zh_CN.UTF-8'
CONNECTION LIMIT = -1;
,错误是:
错误:新排序规则(zh_CN.UTF-8)与模板数据库(en_US.UTF8)的排序规则不兼容 提示:使用与模板数据库中相同的排序规则,或使用template0作为模板。
如何更改模板数据库集合?
答案 0 :(得分:39)
来自PostgreSQL文档:
复制template0而不是template1的另一个常见原因是 复制时可以指定新的编码和区域设置 template0,而template1的副本必须使用相同的设置 确实。这是因为template1可能包含特定于编码的或 特定于语言环境的数据,而template0不知道。
您只能使用template0
创建具有不同编码和区域设置的新数据库:
CREATE DATABASE newdb
WITH OWNER = postgres
ENCODING = 'UTF8'
TABLESPACE = pg_default
LC_COLLATE = 'zh_CN.UTF-8'
CONNECTION LIMIT = -1
TEMPLATE template0;
这将有效,但这意味着您对template1
所做的任何更改都不会应用于新创建的数据库。
要更改template1
的编码和整理,您必须先删除template1
,然后从template1
创建新模板template0
。如何删除模板数据库的描述为here。然后,您可以使用所选的编码/整理创建新数据库template1
,并通过设置datistemplate=true
(example)将其标记为模板:
update pg_database set datistemplate=true where datname='template1';
答案 1 :(得分:4)
Tomas答案是正确的,但是缺少重要的细节(LC_CTYPE
)。这是使用正确的语言环境重新创建template1
的完整序列:
ALTER database template1 is_template=false;
DROP database template1;
CREATE DATABASE template1
WITH OWNER = postgres
ENCODING = 'UTF8'
TABLESPACE = pg_default
LC_COLLATE = 'zh_CN.UTF-8'
LC_CTYPE = 'zh_CN.UTF-8'
CONNECTION LIMIT = -1
TEMPLATE template0;
ALTER database template1 is_template=true;
然后您可以创建新的数据库。