Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 插入时Postgres错误-错误:编码的字节序列无效;UTF8";:0x00_Postgresql - Fatal编程技术网

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

Postgresql 插入时Postgres错误-错误:编码的字节序列无效;UTF8";:0x00,postgresql,Postgresql,我在将mysql中的数据插入postgres时遇到以下错误 我是否必须手动从输入数据中删除所有空字符? 有没有办法让博士后帮我这么做 ERROR: invalid byte sequence for encoding "UTF8": 0x00 PostgreSQL不支持在文本字段中存储NULL(\0x00)字符(这显然不同于完全支持的数据库NULL值) 资料来源: 如果需要存储空字符,则必须使用bytea字段,该字段应存储所需的任何内容,但不支持对其执行文本操作 由于PostgreSQL在文本

我在将mysql中的数据插入postgres时遇到以下错误

我是否必须手动从输入数据中删除所有空字符? 有没有办法让博士后帮我这么做

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")