本文将通过使用示例来介绍如何通过命令来设置模板库、字符集、LC_COLLATE 及 LC_CTYPE 的信息。

克隆模板库是指从指定模板创建数据库。如下示例将介绍如何通过CREATE DATABASE命令从指定模板创建数据库。

以 test 数据库为模板,克隆一个名为 test01 的数据库,其命令如下所示:

    1. test=> create database test01 with template test;
    2. CREATE DATABASE
  • 若不指定模板,则默认的模板为 template1。

  • 从指定模板库创建数据库时,除了当前连接,不能有其他用户连在对应的模板库上面。例如,若有其他用户连在 test 数据库上,可能会报类似如下的错误:

    1. test=> create database test01 with template test;
    2. ERROR: source database "test" is being accessed by other users
    3. DETAIL: There is 1 other session using the database.

创建数据库时,您可以指定 encoding。如下示例将介绍如何通过CREATE DATABASE命令创建指定字符集类型的数据库。

PostgreSQL 支持的字符集类型

您可以通过 PostgreSQL 的官方文档或下表查看对应的字符集支持列表,Server=Yes 表示该字符集支持用于CREATE DATABASE命令,Server=No 表示只支持作为客户端字符集。

    1. test=> create database test02 with encoding 'UTF-8';
    2. CREATE DATABASE
  • 指定的字符集必须是模板库字符集的超集,否则会报错。

  • 指定的 LC_COLLATE 和 LC_CTYPE 必须与目标字符集兼容,否则会报错。

  • 报错示例:template1 是默认模板库,它的字符集为 UTF8,如下所示。

当使用上述 template1 作为模板创建一个字符集为 EUC_CN 的数据库时,会出现如下错误:

  • EUC_CN 字符集与模板库的 LC_COLLATE 和 LC_CTYPE 不兼容。
    • EUC_CN 字符集与模板库的字符集 UTF-8 不兼容。
      1. test=> create database test03 with encoding 'EUC_CN' lc_collate='C' lc_ctype='C';
      2. ERROR: new encoding (EUC_CN) is incompatible with the encoding of the template database (UTF8)
      3. HINT: Use the same encoding as in the template database, or use template0 as template.
    • 解决方法示例:使用 template0 作为模板库,即可解决上述报错的问题。
      1. create database test03 with encoding 'EUC_CN' template template0;

    本示例将介绍如何查询字符集支持的 LC_COLLATE 和 LC_CTYPE、如何通过CREATE DATABASE命令指定 LC_COLLATE 和 LC_CTYPE 以及如何修改已有数据库的 LC_COLLATE 和 LC_CTYPE。

    查询字符集支持的 LC_COLLATE 和 LC_CTYPE 信息

    您可以使用如下 SQL 查询系统表 pg_collation,来获取字符集支持的LC_COLLATE 和 LC_CTYPE 信息。

    返回结果如下所示,encoding 为空时,表示这个 collation 支持所有的字符集。

      1. ------------+-----------------------+-----------------------+-----------------------
      2. | default | |
      3. | C | C | C
      4. | POSIX | POSIX | POSIX
      5. UTF8 | aa_DJ | aa_DJ.utf8 | aa_DJ.utf8
      6. LATIN1 | aa_DJ | aa_DJ | aa_DJ
      7. LATIN1 | aa_DJ.iso88591 | aa_DJ.iso88591 | aa_DJ.iso88591
      8. UTF8 | aa_DJ.utf8 | aa_DJ.utf8 | aa_DJ.utf8
      9. UTF8 | aa_ER | aa_ER | aa_ER
      10. UTF8 | aa_ER.utf8 | aa_ER.utf8 | aa_ER.utf8
      11. .......
      12. EUC_CN | zh_CN | zh_CN | zh_CN
      13. UTF8 | zh_CN | zh_CN.utf8 | zh_CN.utf8
      14. EUC_CN | zh_CN.gb2312 | zh_CN.gb2312 | zh_CN.gb2312
      15. UTF8 | zh_CN.utf8 | zh_CN.utf8 | zh_CN.utf8
      16. UTF8 | zh_HK.utf8 | zh_HK.utf8 | zh_HK.utf8
      17. EUC_CN | zh_SG | zh_SG | zh_SG
      18. EUC_CN | zh_SG.gb2312 | zh_SG.gb2312 | zh_SG.gb2312
      19. UTF8 | zh_SG.utf8 | zh_SG.utf8 | zh_SG.utf8
      20. EUC_TW | zh_TW | zh_TW.euctw | zh_TW.euctw
      21. UTF8 | zh_TW | zh_TW.utf8 | zh_TW.utf8
      22. EUC_TW | zh_TW.euctw | zh_TW.euctw | zh_TW.euctw
      23. UTF8 | zh_TW.utf8 | zh_TW.utf8 | zh_TW.utf8
      24. UTF8 | zu_ZA | zu_ZA.utf8 | zu_ZA.utf8
      25. LATIN1 | zu_ZA | zu_ZA | zu_ZA
      26. LATIN1 | zu_ZA.iso88591 | zu_ZA.iso88591 | zu_ZA.iso88591
      27. UTF8 | zu_ZA.utf8 | zu_ZA.utf8 | zu_ZA.utf8
      28. (869 rows)

    使用示例

      1. test=> create database test05 with encoding 'UTF-8' template template0 lc_collate='zh_CN.utf8' lc_ctype='zh_CN.utf8';
      2. CREATE DATABASE

    若指定的 LC_COLLATE 和 LC_CTYPE 与模板库的 LC_COLLATE 和 LC_CTYPE 不兼容,会出现如下错误:

      1. test=> create database test04 with encoding 'UTF-8' lc_collate='zh_CN.utf8' lc_ctype='zh_CN.utf8';
      2. ERROR: new collation (zh_CN.utf8) is incompatible with the collation of the template database (zh_CN.UTF-8)
      3. HINT: Use the same collation as in the template database, or use template0 as template.

    出现上述错误时,有如下两种解决方法:

    • 使用兼容的 LC_COLLATE 和 LC_CTYPE,其命令如下所示:
    • 使用 template0 作为模板库,其命令如下所示:
      1. test=> create database test05 with encoding 'UTF-8' template template0 lc_collate='zh_CN.utf8' lc_ctype='zh_CN.utf8';
      2. CREATE DATABASE

    修改已有数据库的 LC_COLLATE 和 LC_CTYPE 信息

    目前,您无法直接通过 命令修改已有数据库的 LC_COLLATE 和 LC_CTYPE 信息,但可以通过创建新的数据库,然后导出再导入数据的方式进行修改。

    操作步骤

    • 创建新数据库,指定目标 LC_COLLATE 和 LC_CTYPE。

    • 使用 pg_dump 或其它客户端工具逻辑导出源数据库的数据。