【问题标题】:How can I change database encoding for a PostgreSQL database using sql or phpPgAdmin?如何使用 sql 或 phpPgAdmin 更改 PostgreSQL 数据库的数据库编码?
【发布时间】:2010-09-27 17:05:20
【问题描述】:

如何使用 sql 或 phpPgAdmin 更改 PostgreSQL 数据库的数据库编码?

【问题讨论】:

    标签: postgresql phppgadmin


    【解决方案1】:

    简而言之,您不能只使用 phpPgAdmin 或 SQL 来执行此操作而不冒现有数据损坏的风险。 您必须导出所有数据,创建具有正确编码的数据库并恢复导出的数据。

    你应该这样做:

    1. 创建数据库转储

      pg_dump your_database > your_database.sql

      这会将您的数据库保存为 sql 格式,使用您当前拥有的编码。

    2. 删除数据库(或重命名):

      DROP DATABASE your_database

      如果您有足够的存储空间,我建议您保留旧数据库,直到您确定新数据库一切正常,重命名它:

      ALTER DATABASE your_database RENAME TO your_database_backup;

    3. 使用新编码创建数据库

      CREATE DATABASE your_database WITH ENCODING 'UNICODE' TEMPLATE=template0;

    4. 从之前创建的转储中导入数据

      PGCLIENTENCODING=YOUR_OLD_ENCODING psql -f your_database.sql your_database

      您需要将 psql 客户端编码设置为旧数据库中的编码。

    动态更改编码是不可能的,因为它需要重写大部分内部数据库数据,这几乎等于我描述的重新创建数据库的方式。

    可以仅更改有关数据库的内部 postgres 信息,并且更改后的任何新数据都将正确保存,但是您现有的数据可能会损坏

    【讨论】:

    • 我有一个 cpanel 帐户,如果我备份数据库,我将只能恢复内容,而不能使用新编码重新创建数据库
    • drop = delete,这里是 cpanel 文档的链接:cpanel.net/support/docs/11/cpanel/databases_delete_post.html
    • PostgreSQL 新手在这里...如何使用 SQL 和/或 psql 命令行工具来做到这一点?例如,如果数据库和服务器当前设置为 SQL_ASCII,但我希望它是 UTF-8?
    • 新手与否,你必须知道你的工具,使用 pg_dump 进行数据库转储,使用 psql -f 导入以前转储的数据。删除/创建数据库您可以使用许多不同的工具,sql (DROP DATABASE/CREATE DATABASE [postgresql.org/docs/9.0/static/sql-createdatabase.html])、phpPgAdmin、pgAdmin(可视化工具)。在执行任何操作之前阅读工具文档。
    【解决方案2】:

    要扩展给出的答案,您可以使用这些命令来完成您的任务。

    // Backup the database to outfile
    pg_dump dbname > outfile
    
    // Terminate all connections to the database
    psql -c "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname='dbname';"
    
    // Delete the database
    psql -c "DROP DATABASE dbname;"
    
    //Re-create the database using the encoding keyword
    psql -c "CREATE DATABASE dbname ENCODING='UTF8';"
    
    //Import the saved data
    psql -f outfile
    

    转储数据库:http://www.postgresql.org/docs/9.4/static/backup-dump.html

    创建数据库:http://www.postgresql.org/docs/9.4/static/sql-createdatabase.html

    这是 9.4 版可用的所有编码的列表: http://www.postgresql.org/docs/9.4/static/multibyte.html#MULTIBYTE-CHARSET-SUPPORTED

    【讨论】:

      【解决方案3】:

      您可以在不转储/恢复的情况下即时更改编码:

      update pg_database set encoding = pg_char_to_encoding('UTF8') where datname = 'database_name'
      

      【讨论】:

      • 现在这是一个有用的答案。当问题是“如何更改数据库的编码?”时,“使用新编码创建数据库”是一个非常无用的指令
      • 这是否记录在 postgres 手册的任何地方?使用 postgresql 内部结构并仅更新参考信息可能会导致严重损害。如果这确实重写了所有索引和必要的数据,那就太好了!但如果不是这样,您最终可能会从备份中恢复。
      • @Bobort,你是对的.. 但有一些关于“即时”更改stackoverflow.com/a/5091083/903998.. 的警告似乎是从一个新的数据库(postgres)开始/跨度>
      • 它给了我这个错误:-bash: syntax error near unexpected token ('`
      • 这会破坏现有的 utf-8 文本
      猜你喜欢
      • 2011-12-30
      • 1970-01-01
      • 1970-01-01
      • 2021-07-22
      • 2010-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多