2011-02-23 28 views
62

我有一个使用默认字符集SQL_ASCII设置的数据库。我想将它切换到UNICODE。有没有简单的方法来做到这一点?如何更改postgres数据库的字符编码?

+1

参见http://stackoverflow.com/q/380924的 – dsh 2012-11-02 13:40:09

+1

可能重复[如何选择我使用sql或phpPgAdmin更改PostgreSQL数据库的数据库编码?](http://stackoverflow.com/questions/380924/how-can-i-change-database-encoding-for-a-postgresql-database-using-sql -or-phppga) – l0b0 2013-01-08 08:30:43

回答

47

要更改编码数据库的:

  1. 转储数据库
  2. 放下你的数据库,
  3. 与不同的编码
  4. 刷新您的数据创建新的数据库。

确保客户编码在这一切设置正确。

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

+0

我从链接中得不到的东西是“检查第一步中创建的转储文件是否有任何特殊字符并执行所需的更改”=>是否必须手动更改所有特殊的cha种类 – spankmaster79 2016-03-24 14:02:43

73

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

对于从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

+1谢谢。我的开发机器使用UTF8 enconding,但我的制作使用了LATIN1。因为这个,我有很多错误。 – 2011-04-29 11:50:42

+1

它给了我这个错误: '-bash:语法错误附近意想不到的标记'('' – 2017-06-24 09:17:39

8

倾销与特定的编码数据库,并试图将其在另一个数据库使用不同的编码可能导致数据损坏恢复。 在将任何数据插入数据库之前,必须设置数据编码。

检查this当复制任何其他数据库,编码和区域设置无法从这些源数据库的变化,因为这可能会导致数据损坏。

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


我宁愿重建一切从一开始与您的Debian操作系统正确的本地编码正确的解释here

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(创建字符串排序顺序)。

+2

我认为它是“dpkg-reconfigure locales”,复数。单数形式似乎不工作(只是检查)。 – foo 2014-08-20 16:54:26

+0

TX,我修正了这个修正:) – Douglas 2014-10-16 08:26:39

5

丹尼尔Kutik的答案是正确的,但也可以是更安全的,数据库重命名

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

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

在紧急情况下,只需重命名的DB回