如何更改模板数据库集合编码

时间:2013-09-18 11:16:06

标签: postgresql postgresql-9.2

我希望通过以下方式构建新的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作为模板。

如何更改模板数据库集合?

2 个答案:

答案 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=trueexample)将其标记为模板:

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;

然后您可以创建新的数据库。