2009-02-11 67 views
1

有時在將東西複製到PostgreSQL中時,出現無效字節序列的錯誤。修復Unicode字節序列

是否有使用或者VIM或其他實用程序來檢測引起錯誤,如字節序列的簡單方法:無效無效的字節序列用於編碼「UTF8」:0xde70和諸如此類的東西,以及可能的和簡單的方法來做到的轉化?

編輯:

什麼我的工作流程是:

  1. 甩sqlite3的數據庫(從TRAC)
  2. 試圖重播PostgreSQL中

也許還有一個更簡單的方法嗎?

更多編輯:

也試過這些:

  1. 運行ENCA來檢測該文件

    • 告訴我這是ASCII
  2. 試過的iconv的編碼從ASCII轉換爲UTF8。得到了一個錯誤

什麼做的工作是刪除情侶錯誤路線,它抱怨。但那並沒有真正解決真正的問題。

回答

1

我想通了。這不是一個真正的編碼問題。

SQLite的輸出轉義字符串與Postgres期望的不同。在某些情況下,輸出了「asdf \ xd \ foo」。我相信'\ x'導致它期望以下字符是unicode編碼。

解決方案是在sqlite 3中以CSV模式單獨轉儲每個表。

首先

sqlite3 db/trac.db .schema | psql 

現在,這確實大部分的伎倆將數據複製回

for table in `sqlite3 db/trac.db .schema | grep TABLE | sed 's/.*TABLE \(.*\) (/\1/'` 
do    
echo ".mode csv\nselect * from $table;" | sqlite3 db/trac.db | psql -c "copy $table from stdin with csv" 
done 

呀,種一劈,但它的作品。

4

基於一個簡短的句子,它聽起來像是在一種編碼(例如ANSI/ASCII)中有文本,並且您告訴PostgreSQL它實際上是另一種編碼(Unicode UTF8)。您將使用的所有不同工具:PostgreSQL,Bash,一些編程語言,另一種編程語言,來自其他地方的其他數據,文本編輯器,IDE等等都具有可能不同的默認編碼,方式,正確的轉換沒有完成。我會檢查數據流在哪裏跨越這些邊界,以確保編碼對齊,或者編碼被正確檢測並且文本被正確地轉換。

+0

剛剛嘗試使用iconv嘗試從ASCII轉換爲UTF8。我認爲它已經在UTF8中,因爲我使用ASCII時發生錯誤。 嘗試過iconv -f UTF8 -t UTF8並沒有得到任何錯誤。也許有些東西正在逃避,它不應該在轉儲文件中。 – mikelikespie 2009-02-11 20:08:14

1

如果知道轉儲文件的編碼,可以使用recode將其轉換爲utf-8。例如,如果編碼的Latin-1:

recode latin-1..utf-8 <dump_file> new_dump_file 

如果你不能確定編碼,你應該可以看到sqlite的是如何配置的,也可能嘗試一些試驗和錯誤。