你如何改变一个postgres数据库的字符编码?

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

我有以下准则来更改Postgres数据库的编码(从这里http://archives.postgresql.org/pgsql-novice/2006-03/msg00210.php ):

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

确保在这一切过程中客户端编码设置正确。

我的问题:以上是否正确? 数据库可以被删除吗?

首先,丹尼尔的回答是正确的,安全的select。

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

那你可以这样做:

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

这不会改变数据库的sorting规则,只是如何将编码字节转换为字符(所以现在length('£123')将返回4而不是5)。 如果数据库使用“C”sorting规则,则不应更改为ASCIIstring进行sorting。 你可能需要重build包含非ASCII字符的索引。

买者自负。 转储和重新加载提供了一种方法来检查您的数据库内容实际上是您所期望的编码,而这不是。 如果事实certificate你在数据库中确实有一些错误编码的数据,救援将变得困难。 所以如果可能的话,转储并重新初始化。

转储具有特定编码的数据库并尝试使用不同的编码在另一个数据库上恢复它可能会导致数据损坏。 数据编码必须在数据插入数据库之前设置。

选中此项 : 复制任何其他数据库时,编码和区域设置不能从源数据库的设置更改,因为这可能会导致数据损坏。

而这个 : 一些地区类别必须在数据库创build时修改它们的值。 您可以对不同的数据库使用不同的设置,但是一旦创build了数据库,就不能再为该数据库更改它们。 LC_COLLATE和LC_CTYPE是这些类别。 它们会影响索引的sorting顺序,所以必须保持固定,否则文本列上的索引就会被破坏。但是可以使用sorting规则缓解这种限制,如22.2节所讨论的那样。这些类别的缺省值是在initdb运行时确定的,当创build新数据库时使用这些值,除非在CREATE DATABASE命令中另有指定。


我宁愿从开始正确地使用正确的本地编码在您的debian操作系统中重build所有东西,如下所述:

 su root 

重新configuration您的本地设置:

 dpkg-reconfigure locales 

select您的语言环境(例如瑞士法语: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 

现在任何新的数据库将被自动创build正确的编码,LC_TYPE(字符分类)和LC_COLLATE(stringsorting顺序)。

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

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

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

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