2012-02-24 53 views
2

我在做一個能夠下載遠程postgres數據庫的db_dump的腳本。如何使用正確編碼的db_dump

問題是,我正在嘗試在正確的enconding上獲取遠程數據庫,而我無法做到這一點。

遠程數據庫有一個LATIN1 enconding,當我執行腳本我甩了它是UTF-8

注意,我希望它保持遠程數據庫的編碼,所以如果遠程數據庫是UTF-8我想本地的一個也是utf-8

有人知道如何做到這一點?

+0

因此,你有兩個數據庫和一個腳本,從一個到另一個複製數據?遠程數據庫具有LATIN1編碼。什麼是本地的?您只能在CREATE DATABASE上選擇編碼。如果您不在會話中創建數據庫,那麼它已預先訂購。 SET client_encoding僅在傳輸過程中影響數據。 – kupson 2012-02-29 12:18:26

回答

0

從pg_restore的的文檔:

-C, --create    Zieldatenbank erzeugen 

這將從您的轉儲自動創建目標數據庫。但是,我不知道編碼是否始終正確,或者只是爲您還原到的服務器定義的默認數據庫編碼。

+0

-C對我來說不是一個有效的選擇...它生成我沒有的模板和這樣的東西... 另外上述解決方案不起作用我不知道爲什麼我將SET設置爲正確編碼,但不工作,因爲它應該:( – Killercode 2012-02-27 13:05:18

1

在PostgreSQL數據庫有一個編碼,但也連接到數據庫/會話有一個。 服務器將實時進行必要的數據轉換。

命令pg_dump已經使用正確的編碼 - 默認情況下它是原始數據庫,但可以通過-E選項選擇不同的值。如果使用-C,那麼它將添加具有適當編碼(純文本格式)的CREATE語句。

看看pg_dump的這幾行(-E LATIN1 -C)SQL文件:

SET client_encoding = 'LATIN1'; 
... 
CREATE DATABASE postgres WITH TEMPLATE = template0 ENCODING = 'UTF8' LC_COLLATE = 'pl_PL.UTF-8' LC_CTYPE = 'pl_PL.UTF-8'; 

所有你所要做的是創建數據庫與編碼你想要的,或使用-C pg_dump的選項包括:在轉儲文件中創建命令。 PostgreSQL psql(或pg_restore)將完成剩下的工作。