如何更改模板数据库集合编码
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?
的最正确和最完整的答案以上是关于如何更改模板数据库集合编码的主要内容,如果未能解决你的问题,请参考以下文章