2011-04-25 57 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