2011-04-25 41 views
3

我的問題是,我從csv文件複製數據到數據庫表時遇到編碼錯誤。數據編碼錯誤

psycopg2.DataError:用於編碼「UTF8」的無效字節序列:0xf8 提示:如果字節序列與由「client_encoding」控制的服務器預期的編碼不匹配,也會發生此錯誤。

我沒有使用任何編碼和解碼命令。爲了將文件中的數據複製到表中,我使用了以下代碼。

cur.copy_from(myFile, myTable) 

而這些文件包含很多特殊字符和奇怪的數據。但我想存儲所有這些數據。

EDIT 

該表是:

創建表myTable的(ID整數,名稱字符改變(10000));

和CSV文件的樣本:

"1";"This is |_|¨^~~ || ¨text wuth special charater like Bjш;; ø" 
"2";"Test data -._.- (2010/10/11) " 

回答

1

你寫你沒有指定任何編碼,而且好像psycopg2默認爲UTF-8即可。 0xf8不是有效的單字節UTF-8代碼點。

是您的源文件可能在ISO-8859-1其中0xf8對應於ø

編輯:

有幾個地方,這個問題是可以解決的,以及哪些是正確的取決於你的情況。

  • 如果反覆將不得不進口你可能想用encoding工作,使你的腳本一致ISO-8859-1-文件。

  • 如果您只需要進行一次導入,那麼爲什麼不簡單地將文件轉換爲Python以外的預期格式,例如iconvrecode

+0

或-15如果你有歐元符號 – 2011-04-26 22:56:48

+0

@Stephan:是的,ISO-8859-15也是一種可能性,或多或少的任何8位編碼。所有ISO-8859變體的代碼點都是0xf8。 – 2011-04-28 11:22:39

0

數據庫中列的數據類型是什麼?它應該適合你想要的任何東西。

如果要存儲字節數據,請使用二進制數據類型。 如果要存儲文本數據,請使用字符數據類型。

你不能指望你的數據庫可以存儲一個.jpg文件作爲文本,只是因爲它不是文本。

+0

我的表的數據類型包含字符變化(10000)和整數。而且我不想將任何.jpg文件存儲爲文本。我收到這個錯誤,因爲我在文本中有很多特殊字符,例如:「| _ |」 ,但我想將它們保存原樣。 – 2011-04-25 08:58:31

0

如果要按原樣存儲它,則不能使用字符數據類型。或者至少不是檢查編碼有效性的地方。這聽起來像輸入數據不是UTF8編碼。

您可以修復編碼或切換到另一個數據類型。 如果您有多個輸入文件具有不同的編碼,當您嘗試比較所有編碼中不存在的字符時,可能會遇到有趣的比較問題。

+0

我應該使用哪些數據類型來保存這些類型的字符 – 2011-04-27 07:00:29

+0

呃,bytearray?字節是str的別名,因此可能無法工作。 – 2011-04-29 16:48:11