【问题标题】:How do you change the character encoding of a postgres database?如何更改 postgres 数据库的字符编码?
【发布时间】:2011-07-02 17:29:44
【问题描述】:

我有一个使用默认字符集 SQL_ASCII 设置的数据库。我想将其切换为 UNICODE。有没有简单的方法可以做到这一点?

【问题讨论】:

标签: postgresql unicode


【解决方案1】:

更改数据库的编码:

  1. 转储数据库
  2. 删除你的数据库,
  3. 使用不同的编码创建新数据库
  4. 重新加载您的数据。

确保在所有这些过程中正确设置客户端编码。

来源:http://archives.postgresql.org/pgsql-novice/2006-03/msg00210.php

【讨论】:

  • 关于我没有从链接中得到的东西是“检查在第一步中创建的转储文件是否有任何特殊字符并进行所需的更改”=>我是否必须手动更改所有特殊字符字符
  • 您能否将转储和重新导入的命令添加到您的答案中?喜欢sudo -u postgres pg_dump your_db > /backups/postgresql.sql ...
【解决方案2】:

首先,丹尼尔的答案是正确、安全的选择。

对于从 SQL_ASCII 更改为其他内容的特定情况,您可以作弊并简单地戳 pg_database 目录以重新分配数据库编码。这假设您已经以预期的编码存储了任何非 ASCII 字符(或者您根本没有使用任何非 ASCII 字符)。

那么你可以这样做:

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

这不会改变数据库的排序规则,只是将编码字节转换为字符的方式(所以现在length('£123') 将返回 4 而不是 5)。如果数据库使用“C”排序规则,那么 ASCII 字符串的排序应该没有变化。不过,您可能需要重建任何包含非 ASCII 字符的索引。

告诫购买者。转储和重新加载提供了一种方法来检查您的数据库内容实际上是否在您期望的编码中,而事实并非如此。如果事实证明你在数据库中确实有一些错误编码的数据,那么救援将会很困难。因此,如果可以,请转储并重新初始化。

【讨论】:

  • +1 谢谢。我的开发机器使用 UTF8 编码,但我的生产使用 LATIN1。因此,我犯了很多错误。
  • 它给了我这个错误:-bash: syntax error near unexpected token ('`
  • @AbhipsoGhosh 这不应该被粘贴到 bash shell 中,而是在 psql 提示符下。
  • @araqnid,兆字节的无用信息,这就是你需要的答案,谢谢
【解决方案3】:

转储具有特定编码的数据库并尝试将其还原到具有不同编码的另一个数据库可能会导致数据损坏。 必须在将任何数据插入数据库之前设置数据编码。

检查this在复制任何其他数据库时,无法更改源数据库的编码和区域设置,因为这可能会导致数据损坏。

还有this创建数据库时,某些语言环境类别的值必须固定。您可以对不同的数据库使用不同的设置,但是一旦创建了数据库,就不能再为该数据库更改它们。 LC_COLLATE 和 LC_CTYPE 就是这些类别。 它们影响索引的排序顺序,所以它们必须保持固定,否则文本列上的索引会损坏。但是你可以使用排序规则来缓解这个限制,如第 22.2 节所述。 ) 这些类别的默认值是在运行 initdb 时确定的,并且在创建新数据库时使用这些值,除非在 CREATE DATABASE 命令中另外指定。


我宁愿按照here 的解释,在您的 debian 操作系统上使用正确的本地编码从头开始正确重建所有内容:

su root

重新配置您的本地设置:

dpkg-reconfigure locales

选择您的语言环境(例如瑞士的法语:fr_CH.UTF8)

正确卸载和清理 postgresql :

apt-get --purge remove postgresql\*
rm -r /etc/postgresql/
rm -r /etc/postgresql-common/
rm -r /var/lib/postgresql/
userdel -r postgres
groupdel postgres

重新安装postgresql:

aptitude install postgresql-9.1 postgresql-contrib-9.1 postgresql-doc-9.1

现在任何新数据库都将自动创建并使用正确的编码、LC_TYPE(字符分类)和 LC_COLLATE(字符串排序顺序)。

【讨论】:

  • 我认为是“dpkg-reconfigure locales”,复数形式。单数形式似乎不起作用(刚刚检查)。
【解决方案4】:

Daniel Kutik 的回答是正确的,但它可以更加安全,数据库重命名

所以,真正安全的方法是:

  1. 使用不同的编码和名称创建新数据库
  2. 转储数据库
  3. 将转储恢复到新数据库
  4. 测试您的应用程序是否使用新数据库正确运行
  5. 将旧数据库重命名为有意义的名称
  6. 重命名新数据库
  7. 再次测试应用程序
  8. 删除旧数据库

在紧急情况下,只需重新命名数据库

【讨论】:

    【解决方案5】:
    # dump into file
    pg_dump myDB > /tmp/myDB.sql
    
    # create an empty db with the right encoding (on older versions the escaped single quotes are needed!)
    psql -c 'CREATE DATABASE "tempDB" WITH OWNER = "myself" LC_COLLATE = '\''de_DE.utf8'\'' TEMPLATE template0;'
    
    # import in the new DB
    psql -d tempDB -1 -f /tmp/myDB.sql
    
    # rename databases
    psql -c 'ALTER DATABASE "myDB" RENAME TO "myDB_wrong_encoding";' 
    psql -c 'ALTER DATABASE "tempDB" RENAME TO "myDB";'
    
    # see the result
    psql myDB -c "SHOW LC_COLLATE"   
    

    【讨论】:

      猜你喜欢
      • 2015-11-06
      • 2011-08-07
      • 2015-04-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多