2012-01-10 121 views
8

我剛剛在我的項目中得到了postgreSQL中的數據庫,並且意識到它使用了SQL_ASCII編碼,這意味着我認爲「無編碼」。如何將postgreSQL中的數據庫轉換爲utf8?

那麼將此轉換爲utf8的最簡單方法是什麼?我知道db應該是latin1,轉換是否會損壞內容?

謝謝!

回答

9

轉換爲UTF8不會損壞您的數據,因爲我相信沒有不會轉換的字符。

最好的辦法是重新構建數據庫,即轉儲它,創建一個utf8數據庫,然後將轉儲恢復到該新數據庫。

postgres pg_dump --encoding utf8 main -f main.sql 
createdb -E utf8 newMain 
psql -f main.sql -d newMain 

一旦你高興的是,新的UTF8一個您的數據相匹配,您可以的話當然重命名數據庫。

+1

我試過但最後一步,當我在SQL文件中轉儲時,它告訴我「psql:lo17_utf8.sql:6615:錯誤:編碼爲」UTF8「的無效字節序列:0xe96365」 – darkjh 2012-01-10 21:56:25

+1

它似乎是stange,我告訴pg_dump用utf8轉儲數據庫,但是當我使用file命令檢查它時,它告訴我轉儲是在latin1中。 – darkjh 2012-01-10 22:24:28

+1

現在好了,謝謝。 – darkjh 2012-01-10 22:25:27

1

我使用這些命令解決了問題;

1-)導出

pg_dump --username=postgres --encoding=ISO88591 database -f database.sql 

2-之後)導入

psql -U postgres -d database < database.sql 

這些命令幫我解決轉換SQL_ASCII的問題 - UTF-8

2

UTF-8轉換完全是關於保存在非UTF-8數據庫中的字符類型:取決於提出的解決方案的數據可能會失敗。 我設法轉換礦井下面這個tutorial,使用重新編碼(從GNU項目,讓你改變即時給定文件的編碼一個小工具),我想出了這個:

pg_dump -v --encoding utf8 -Fc -Z9 -c -f origindb.sql.bin iso8859-1-db 

pg_restore origindb.sql.bin | recode iso-8859-1..u8 | psql --dbname utf8converteddb 
0

我上面搜索整個互聯網尋找解決這一問題,並Koyots解決方案工作第一次浪費了無數個小時亂投醫老SQL_ASCII數據庫遷移到新的UTF8數據庫

要在解決擴大後...

  • 我第一次重定向所有的網站維護頁面
  • 更名數據庫通過附加「_ascii」它的名字只是爲了確保沒有什麼可以連接到它,也讓我知道後說,這是原始數據庫!
  • 創建與附加到名稱 「_utf8」 的新的UTF8數據庫(附加TEMPLATE = template0中到CREATE DATABASE語句)
  • 備份的ASCII數據庫
  • 恢復的備份到新的UTF8數據庫
  • 更名utf8數據庫返回到我之前命名的內容
  • 檢查數據庫總大小與原始數據庫的大小大致相同。由於死元組等原因不能完全匹配。新的數據庫應該根據填充因子等而變小。
  • 關閉網站重定向
  • 測試網站

我建議保留這兩個數據庫的幾個星期,直到你確信你沒有任何數據丟失(只要你能騰出磁盤空間)