Postgresql 插入时Postgres错误-错误:编码的字节序列无效;UTF8";:0x00
我在将mysql中的数据插入postgres时遇到以下错误 我是否必须手动从输入数据中删除所有空字符? 有没有办法让博士后帮我这么做Postgresql 插入时Postgres错误-错误:编码的字节序列无效;UTF8";:0x00,postgresql,Postgresql,我在将mysql中的数据插入postgres时遇到以下错误 我是否必须手动从输入数据中删除所有空字符? 有没有办法让博士后帮我这么做 ERROR: invalid byte sequence for encoding "UTF8": 0x00 PostgreSQL不支持在文本字段中存储NULL(\0x00)字符(这显然不同于完全支持的数据库NULL值) 资料来源: 如果需要存储空字符,则必须使用bytea字段,该字段应存储所需的任何内容,但不支持对其执行文本操作 由于PostgreSQL在文本
ERROR: invalid byte sequence for encoding "UTF8": 0x00
PostgreSQL不支持在文本字段中存储NULL(\0x00)字符(这显然不同于完全支持的数据库NULL值) 资料来源: 如果需要存储空字符,则必须使用bytea字段,该字段应存储所需的任何内容,但不支持对其执行文本操作
由于PostgreSQL在文本值中不支持它,所以没有好的方法让它删除它。您可以将数据导入bytea,然后使用一个特殊的函数(可能是perl或其他语言?)将其转换为文本,但在加载数据之前进行预处理可能会更容易。您可以先将数据插入blob字段,然后使用下面的函数复制到文本字段
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;
--
只需正则表达式输出空字节:
s/\x00//g;
如果您使用的是Java,则只需在插入之前替换x00字符,如下所示:
myValue.replaceAll("\u0000", "")
Csaba在以下帖子中提供并解释了解决方案:
分别为:
在Java中,字符串中实际上可以有一个“0x0”字符,并且
这是有效的unicode。这被翻译成了中的字符0x0
UTF8,由于服务器使用null,因此不接受UTF8
终止字符串。。。所以唯一的办法就是确保你的字符串
不包含字符“\u0000”
只有这个正则表达式对我有效:
sed 's/\\0//g'
因此,当您获取数据时,请执行以下操作:
$get|u data|sed's/\\0//g'
,它将在不使用0x00的情况下输出您的数据。如果您需要在文本字段中存储空字符,并且不想更改除文本以外的数据类型,那么您也可以遵循我的解决方案:
插入前:
myValue = myValue.replaceAll("\u0000", "SomeVerySpecialText")
选择后:
myValue = myValue.replaceAll("SomeVerySpecialText","\u0000")
我使用了“null”作为我的一些特殊文本,我确信在我的值中不会有任何“null”字符串。当使用和使用包含null值(00
)的转义字符串时,也会发生这种错误,例如:
“H\x00\x00\x00tj\xA8\x9E\D\x98+\xCA\xF0\xA7\xBBl\xC5\x19\xD7\x8D\xB6\x18\xEDJ\x1En”
如果使用COPY
而不指定格式“CSV”
postgres,默认情况下将采用格式“text”
。这与反斜杠有不同的交互作用,请参见
如果使用的是COPY
或文件_fdw
请确保指定格式“CSV”
以避免此类错误。示例:创建表存储\u字节(键整数不为NULL,数据字节不为NULL)
空字符串是否被视为空字节?replaceAll(“s/\x00//g”,”)
不会导致用其他空字符串替换它们吗?空字符串不被视为空字节。空字节值是实际字符,但不可见。因此,postgres不符合UTF-8。看来我会整晚都没睡,因为他们撒谎了。
myValue = myValue.replaceAll("SomeVerySpecialText","\u0000")