在Linux上为PostgreSQL配置区域设置

8
我在设置和运行特定数据库时遇到了麻烦。我试图恢复一个从别人那里得到的postgreSQL转储。我已经尝试了几种方法,但都没有成功。
  1. 直接使用pg_restore

    pg_restore -C -d postgres --exit-on-error maggie_prod_20111221.dump.sql

  2. 先创建数据库和表空间

    createdb -T template0 maggieprod -E LATIN1

    SQL: CREATE TABLESPACE magdat OWNER maggie LOCATION '/somewhere/magdat';

    pg_restore -v -d template1 maggie_prod_20110121.dump.sql

使用第一种方法时,我得到了以下结果:

pg_restore: [archiver (db)] Error while PROCESSING TOC:

pg_restore: [archiver (db)] Error from TOC entry 2308; 1262 16386 DATABASE maggieprod postgres

pg_restore: [archiver (db)] could not execute query: ERROR: encoding LATIN1 does not match locale en_CA.utf8

DETAIL: The chosen LC_CTYPE setting requires encoding UTF8. Command was: CREATE DATABASE maggieprod WITH TEMPLATE = template0 ENCODING = 'LATIN1' TABLESPACE = magdat;

而使用第二种方法时,当我尝试创建数据库时,我得到了以下结果:

createdb: database creation failed: ERROR: encoding LATIN1 does not match locale en_CA.utf8

DETAIL: The chosen LC_CTYPE setting requires encoding UTF8.

所以看起来我无法创建一个LATIN1编码的数据库?为什么会这样呢?我对区域设置和编码不太熟悉,不知道很多关于它们的事情。我只知道这个转储是从一个LATIN1数据库中创建的。 locale 的输出是:

LANG=en_CA.utf8 LC_CTYPE="en_CA.utf8" LC_NUMERIC="en_CA.utf8" LC_TIME="en_CA.utf8" LC_COLLATE="en_CA.utf8" LC_MONETARY="en_CA.utf8" LC_MESSAGES="en_CA.utf8" LC_PAPER="en_CA.utf8" LC_NAME="en_CA.utf8" LC_ADDRESS="en_CA.utf8" LC_TELEPHONE="en_CA.utf8" LC_MEASUREMENT="en_CA.utf8" LC_IDENTIFICATION="en_CA.utf8" LC_ALL=

locale -a 的输出是:

C en_AG en_AG.utf8 en_AU.utf8 en_BW.utf8 en_CA.utf8 en_DK.utf8 en_GB.utf8 en_HK.utf8 en_IE.utf8 en_IN en_IN.utf8 en_NG en_NG.utf8 en_NZ.utf8 en_PH.utf8 en_SG.utf8 en_US.utf8 en_ZA.utf8 en_ZW.utf8 POSIX

在第二个命令中我没有看到LATIN1,是否需要添加它呢?如果需要,应该如何添加呢?我能否假设需要更改计算机的地区设置?如果是这样,有没有一种只针对postgreSQL的方法?另外,当我尝试打开转储文件时,我看到很多垃圾字符,我认为这是由于编码问题导致的,请问如何正确查看它们呢?

感谢您的任何帮助。

3个回答

8

您需要使用与编码匹配的区域设置来创建数据库,例如:

createdb -T template0 maggieprod -E LATIN1 --locale=en_CA

由于您没有安装所有区域设置,我猜测您正在使用Debian或Ubuntu。在这种情况下,请调用dpkg-reconfigure locales或安装locales-all包。

或者,使用编码UTF8创建数据库。只要所有客户端正确设置客户端编码,就不会有任何影响。


安装locales-all软件包对我很有帮助。谢谢。 - gdonald

1

我在使用The_Denominater创建数据库语法时遇到了麻烦,所以我采用了以下方式:

CREATE DATABASE maggieprod WITH ENCODING = 'LATIN1'
  LC_CTYPE = 'en_CA' LC_COLLATE = 'en_CA'
  TEMPLATE template0;

0

如果您仍然有兴趣,使用recode命令将会在导入新数据库之前将您的数据库转换为所选字符集。请参考此链接 - http://blog.e-shell.org/134


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接