如何更改postgres数据库的字符编码?


Answers:


64

要更改数据库的编码:

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

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

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


关于我无法从链接获得的信息是“检查在第一步中创建的转储文件是否具有任何特殊字符并进行所需的更改” =>我是否必须手动更改所有特殊字符
spankmaster79

1
您能否添加命令以转储并重新导入到您的答案中?像sudo -u postgres pg_dump your_db > /backups/postgresql.sql...
rubo77 '18

104

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

对于从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编码,但我的生产使用LATIN1。因此,我犯了很多错误。
Luiz Damim

1
它给了我这个错误:(-bash: syntax error near unexpected token '`
Abhipso Ghosh

@AbhipsoGhosh不应将其粘贴到bash外壳中,而应在psql提示时粘贴。
Pierre

14

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

检查此内容复制任何其他数据库时,无法更改源数据库的编码和语言环境设置,因为这可能会导致数据损坏。

有些区域范畴必须在创建数据库时,它们的值固定。您可以对不同的数据库使用不同的设置,但是一旦创建了数据库,就无法再为该数据库更改它们。LC_COLLATE和LC_CTYPE是这些类别。它们会影响索引的排序顺序,因此必须保持固定,否则文本列上的索引会损坏。但是您可以使用归类来减轻此限制,如第22.2节中所述。这些类别的默认值是在运行initdb时确定的,而这些值是在创建新数据库时使用的,除非在CREATE DATABASE命令中另有指定。


我宁愿从作为解释正确与正确的本地编码在您的Debian操作系统begining重建一切在这里

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语言环境”,复数形式。单数形式似乎不起作用(仅经过检查)。
2014年

9

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

因此,真正安全的方法是:

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

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


7
# 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"   
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.