插入时的Postgres错误 - 错误:编码"UTF8"的无效字节序列:0x00

ScA*_*er2 61 postgresql

将数据从mysql插入postgres时出现以下错误.

我是否必须手动删除输入数据中的所有空字符?有没有办法让postgres为我这样做?

ERROR: invalid byte sequence for encoding "UTF8": 0x00
Run Code Online (Sandbox Code Playgroud)

Mag*_*der 52

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或其他内容中,可能?),但在加载之前预处理可能会更容易.


小智 17

只需正则表示空字节:

s/\x00//g;
Run Code Online (Sandbox Code Playgroud)

  • 空字符串不被视为空字节.空字节值是实际字符,但不可见. (3认同)

Dav*_*sco 12

如果您使用的是Java,则可以在插入之前替换x00字符,如下所示:

myValue.replaceAll("\u0000", "")
Run Code Online (Sandbox Code Playgroud)

Csaba在以下帖子中提供并解释了该解决方案:

https://www.postgresql.org/message-id/1171970019.3101.328.camel%40coppola.muc.ecircle.de

分别:

在Java中,你的字符串中实际上可以有一个"0x0"字符,这是有效的unicode.所以它被转换为UTF8中的字符0x0,而后者又不被接受,因为服务器使用空终止字符串...所以唯一的方法是确保你的字符串不包含字符'\ u0000'.

  • 最好使用 myValue.replace("\u0000", "")。它会做完全相同的事情,但它不使用正则表达式。会更快。 (3认同)
  • 因此,postgres 不兼容 UTF-8。看来我要整晚不睡觉来解决生产问题,因为他们撒了谎。 (2认同)