插入Postgres错误 – 错误:编码“UTF8”的无效字节序列:0x00
从mysql插入数据到postgres时出现以下错误。
我是否需要手动删除input数据中的所有空字符? 有没有办法让postgres为我做这个?
ERROR: invalid byte sequence for encoding "UTF8": 0x00
PostgreSQL不支持在文本字段中存储NULL(\ 0x00)字符(这与数据库NULL值完全不同)。
来源: http : //www.postgresql.org/docs/9.1/static/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS-UESCAPE
如果你需要存储NULL字符,你必须使用一个bytea字段 – 它应该存储任何你想要的,但不会支持文本操作。
鉴于PostgreSQL不支持它的文本值,没有好办法让它删除它。 你可以将数据导入到bytea中,然后使用一个特殊的函数(perl或者其他东西,或许?)将其转换为文本,但是在加载之前在预处理中可能会更容易。
只是正则expression式空字节:
s/\x00//g;
如果您正在使用Java,则可以在插入之前replacex00个字符,如下所示:
myValue.replaceAll("\u0000", "")
该解决scheme由Csaba在以下文章中提供并解释:
https://www.postgresql.org/message-id/1171970019.3101.328.camel%40coppola.muc.ecircle.de
分别:
在Java中,你实际上可以在你的string中有一个“0x0”字符,这是有效的unicode。 所以这被翻译成UTF8中的字符0x0,而这又不被接受,因为服务器使用空字符结束的string…所以唯一的方法是确保你的string不包含字符'\ u0000'。
您可以先将数据插入blob字段,然后使用下列function复制到文本字段
CREATE OR REPLACE FUNCTION blob2text() RETURNS void AS $$ Declare ref record; i integer; Begin FOR ref IN SELECT id, blob_field FROM table LOOP -- find 0x00 and replace with space i := position(E'\\000'::bytea in ref.blob_field); WHILE i > 0 LOOP ref.bob_field := set_byte(ref.blob_field, i-1, 20); i := position(E'\\000'::bytea in ref.blobl_field); END LOOP UPDATE table SET field = encode(ref.blob_field, 'escape') WHERE id = ref.id; END LOOP; End; $$ LANGUAGE plpgsql;
–
SELECT blob2text();
其中一个原因可能是文件中列数据的新行