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

Posted

技术标签:

【中文标题】如何更改模板数据库集合编码【英文标题】:How to change the template database collection coding 【发布时间】:2013-09-18 11:16:06 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

update pg_database set datistemplate=true  where datname='template1';

【讨论】:

【参考方案2】:

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;

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

【讨论】:

这是How to change the template database?最正确和最完整的答案

以上是关于如何更改模板数据库集合编码的主要内容,如果未能解决你的问题,请参考以下文章

如何在 XSLT 条件下更改硬编码元素的位置?

如何实现地图和集合通用的模板?

Angular 10 - 如何在集合更改时自动加载新项目

如何更改MySQL数据库编码为UTF-8或者GB2312?

django的模板页面里,如何获取一个集合的数据?

如何动态更改 Mongoose 提供程序中的集合或数据库的名称,Nestjs?