How do you change the character encoding of a postgres database?
我有一个使用默认字符集SQL_ASCII设置的数据库。 我想将它切换到UNICODE。 有一个简单的方法吗?
首先,丹尼尔的回答是正确,安全的选择。
对于从SQL_ASCII更改为其他内容的特定情况,您可以作弊并简单地戳pg_database目录以重新分配数据库编码。这假设您已经在预期的编码中存储了任何非ASCII字符(或者您根本没有使用任何非ASCII字符)。
然后你可以这样做:
1 | UPDATE pg_database SET encoding = pg_char_to_encoding('UTF8') WHERE datname = 'thedb' |
这不会改变数据库的排序规则,只是如何将编码的字节转换为字符(所以现在
买者自负。转储和重新加载提供了一种方法来检查您的数据库内容实际上是您期望的编码,而事实并非如此。如果事实证明你在数据库中确实有一些错误编码的数据,那么抢救将很困难。所以,如果你可以,转储和重新初始化。
要更改数据库的编码:
确保在所有这些过程中正确设置了客户端编码。
资料来源:http://archives.postgresql.org/pgsql-novice/2006-03/msg00210.php
使用特定编码转储数据库并尝试使用不同的编码在另一个数据库上将其还原可能会导致数据损坏。
必须在将任何数据插入数据库之前设置数据编码。
检查一下:
复制任何其他数据库时,无法更改源数据库的编码和语言环境设置,因为这可能会导致数据损坏。
还有这个 :
创建数据库时,某些区域设置类别必须固定其值。您可以对不同的数据库使用不同的设置,但是一旦创建了数据库,就无法再为该数据库更改它们。 LC_COLLATE和LC_CTYPE是这些类别。它们会影响索引的排序顺序,因此必须保持它们不变,否则文本列上的索引将会损坏。 (但是您可以使用排序规则来缓解此限制,如第22.2节中所述。)这些类别的默认值在运行initdb时确定,并且在创建新数据库时使用这些值,除非在CREATE DATABASE命令中另行指定。
我宁愿在debian操作系统上使用正确的本地编码从头开始重建所有内容,如下所述:
1 | su root |
重新配置本地设置:
1 | dpkg-reconfigure locales |
选择您的语言环境(例如瑞士法语:fr_CH.UTF8)
正确卸载并清理postgresql:
1 2 3 4 5 6 | 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:
1 | aptitude install postgresql-9.1 postgresql-contrib-9.1 postgresql-doc-9.1 |
现在,将使用正确的编码,LC_TYPE(字符分类)和LC_COLLATE(字符串排序顺序)自动创建任何新数据库。
Daniel Kutik的答案是正确的,但通过数据库重命名可以更安全。
所以,真正安全的方法是:
在紧急情况下,只需重命名DB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # 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" |