2011-02-08 21 views
7

我在設置和運行特定數據庫時遇到問題。我試圖恢復從其他人那裏得到的PostgreSQL轉儲。我嘗試了一些方法無濟於事。在Linux上爲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;

的d。使用第二次,當我嘗試創建我得到的數據庫:

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做到這一點?另外,當我嘗試打開轉儲時,我看到很多垃圾字符,我假設這是因爲編碼,我如何正確地查看它?

感謝您的任何幫助。

回答

6

您需要與匹配的編碼,例如語言環境創建數據庫,

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

由於您沒有安裝所有的語言環境中做什麼,我猜你使用的是Debian或Ubuntu。在這種情況下,請致電dpkg-reconfigure locales或安裝locales-all包。

或者,使用編碼UTF8創建數據庫。只要所有的客戶端都正確設置了客戶端編碼,它就不會有什麼區別。

1

我不得不使用從The_Denominater的CREATEDB語法麻煩,所以我做了以下方式:

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

如果你仍然有興趣通過重新編碼命令將改變你的數據庫轉儲的字符集您所選擇的然後將其導入到新的數據庫中。看到這個鏈接 - http://blog.e-shell.org/134