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

use*_*909 27 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;
Run Code Online (Sandbox Code Playgroud)

而错误是:

错误:新排序规则(zh_CN.UTF-8)与模板数据库的排序规则不兼容(en_US.UTF8)
提示:使用与模板数据库中相同的排序规则,或使用template0作为模板.

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

Tom*_*eif 41

从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;
Run Code Online (Sandbox Code Playgroud)

这将起作用,但这意味着您所做的任何更改template1都不会应用于新创建的数据库.

要更改编码和整理template1,你必须先删除template1然后再创建新的模板template1从template0.这里描述了如何删除模板数据库.然后,您可以template1使用选定的编码/排序规则创建新数据库,并通过设置datistemplate=true(示例)将其标记为模板:

update pg_database set datistemplate=true  where datname='template1';
Run Code Online (Sandbox Code Playgroud)


dav*_*rez 13

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;
Run Code Online (Sandbox Code Playgroud)

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

  • 这是“如何更改模板数据库?”的**最正确和完整的答案** (3认同)