我有一个使用默认字符集SQL_ASCII设置的数据库。我想将它切换到UNICODE。有没有一种简单的方法可以做到这一点?
答案 0 :(得分:91)
首先,丹尼尔的回答是正确,安全的选择。
对于从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 :(得分:53)
更改数据库的编码:
确保在所有这些过程中正确设置了客户端编码。
来源:http://archives.postgresql.org/pgsql-novice/2006-03/msg00210.php
答案 2 :(得分:9)
使用特定编码转储数据库并尝试使用不同的编码在另一个数据库上将其还原可能会导致数据损坏。 必须在将任何数据插入数据库之前设置数据编码。
检查this: 复制任何其他数据库时,无法更改源数据库的编码和区域设置,因为这可能会导致数据损坏。
this: 创建数据库时,某些区域设置类别的值必须已修复。您可以对不同的数据库使用不同的设置,但是一旦创建了数据库,就不能再为该数据库更改它们。 LC_COLLATE和LC_CTYPE是这些类别。 它们会影响索引的排序顺序,因此它们必须保持固定,否则文本列上的索引将会损坏。(但是您可以使用排序规则来缓解此限制,如第22.2节中所述。 )这些类别的默认值在运行initdb时确定,并且在创建新数据库时使用这些值,除非在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(字符串排序顺序)自动创建任何新数据库。
答案 3 :(得分:7)
Daniel Kutik的回答是正确的,但使用 数据库重命名 可以更安全。
所以,真正安全的方法是:
如遇紧急情况,只需将DB重命名为
答案 4 :(得分:3)
# 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"