【问题标题】: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 作为模板。

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

【问题讨论】:

    标签: postgresql postgresql-9.2


    【解决方案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?最正确和最完整的答案
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-22
      • 2011-07-02
      • 2015-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-19
      相关资源
      最近更新 更多