40

我想通过以下方式构建新的 postgreSQL 数据库:

CREATE DATABASE newdb
WITH OWNER = postgres
   ENCODING = 'UTF8'
   TABLESPACE = pg_default
   LC_COLLATE = 'zh_CN.UTF-8'
   CONNECTION LIMIT = -1;

错误是:

ERROR: new collat​​ion (zh_CN.UTF-8) is not compatible with the collat​​ion of the template database (en_US.UTF8)
HINT: 使用与模板数据库中相同的排序规则,或使用 template0 作为模板。

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

4

2 回答 2

64

来自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然后template1template0. 此处描述了如何删除模板数据库。然后您可以使用选择的编码/排序规则创建新数据库,并通过设置(示例template1)将其标记为模板:datistemplate=true

update pg_database set datistemplate=true  where datname='template1';
于 2013-09-18T13:10:58.477 回答
17

托马斯的回答是正确的,但它缺少一个重要的细节(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;

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

于 2020-02-25T14:12:28.637 回答