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

Nic*_*ack 74 postgresql unicode

我有一个使用默认字符集SQL_ASCII设置的数据库.我想将它切换到UNICODE.有一个简单的方法吗?

ara*_*nid 96

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

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

然后你可以这样做:

update pg_database set encoding = pg_char_to_encoding('UTF8') where datname = 'thedb'
Run Code Online (Sandbox Code Playgroud)

这不会改变数据库的整理,只是如何将编码的字节转换为字符(因此现在length('£123')将返回4而不是5).如果数据库使用"C"排序规则,则不应更改ASCII字符串的排序.您可能需要重建包含非ASCII字符的任何索引.

买者自负.转储和重新加载提供了一种方法来检查您的数据库内容实际上是您期望的编码,而事实并非如此.如果事实证明你在数据库中确实有一些错误编码的数据,那么抢救将很困难.所以,如果你可以,转储和重新初始化.


Dan*_*tik 57

要更改数据库的编码:

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

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

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


Dou*_*las 11

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

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

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


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

su root
Run Code Online (Sandbox Code Playgroud)

重新配置本地设置:

dpkg-reconfigure locales
Run Code Online (Sandbox Code Playgroud)

选择您的语言环境(例如瑞士法语: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
Run Code Online (Sandbox Code Playgroud)

重新安装postgresql:

aptitude install postgresql-9.1 postgresql-contrib-9.1 postgresql-doc-9.1
Run Code Online (Sandbox Code Playgroud)

现在,将使用正确的编码,LC_TYPE(字符分类)和LC_COLLATE(字符串排序顺序)自动创建任何新数据库.

  • 我认为这是"dpkg-reconfigure locales",复数.单数形式似乎不起作用(刚检查). (2认同)

小智 9

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

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

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

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


rub*_*o77 8

# 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"   
Run Code Online (Sandbox Code Playgroud)