IT Share you

삽입시 Postgres 오류-오류 : "UTF8"인코딩에 대한 잘못된 바이트 시퀀스 : 0x00

shareyou 2020. 12. 1. 20:04
반응형

삽입시 Postgres 오류-오류 : "UTF8"인코딩에 대한 잘못된 바이트 시퀀스 : 0x00


mysql의 데이터를 postgres에 삽입 할 때 다음 오류가 발생합니다.

입력 데이터에서 모든 null 문자를 수동으로 제거해야합니까? 나를 위해 이것을 수행하기 위해 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 등에서)를 사용하여 텍스트로 변환 할 수 있지만로드하기 전에 전처리에서 수행하는 것이 더 쉬울 것입니다.


null 바이트를 정규식으로 지정하십시오.

s/\x00//g;

Java를 사용하는 경우 다음과 같이 삽입하기 전에 x00 문자를 바꿀 수 있습니다.

myValue.replaceAll("\u0000", "")

솔루션은 다음 게시물에서 Csaba가 제공하고 설명했습니다.

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

각기:

Java에서는 실제로 문자열에 "0x0"문자를 포함 할 수 있으며 이는 유효한 유니 코드입니다. 따라서 UTF8의 문자 0x0으로 변환됩니다. 서버가 null로 끝나는 문자열을 사용하기 때문에 허용되지 않습니다. 따라서 유일한 방법은 문자열에 '\ u0000'문자가 포함되지 않도록하는 것입니다.


먼저 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; 

-

SELECT blob2text();

이 정규식 만 나를 위해 일했습니다.

sed 's/\\0//g'

그래서 당신이 얻을 귀하의 데이터는 다음을 수행 $ get_data | sed 's/\\0//g'하는 의지 출력 데이터를하지 않고0x00


텍스트 필드에 null 문자를 저장해야하고 텍스트 이외의 데이터 유형을 변경하지 않으려면 내 솔루션을 따를 수도 있습니다.

삽입 전 :

myValue = myValue.replaceAll("\u0000", "SomeVerySpecialText")

선택 후 :

myValue = myValue.replaceAll("SomeVerySpecialText","\u0000")

I've used "null" as my SomeVerySpecialText which I am sure that there will be no any "null" string in my values at all.


This kind of error can also happen when using COPY and having an escaped string containing NULL values(00) such as:

"H\x00\x00\x00tj\xA8\x9E#D\x98+\xCA\xF0\xA7\xBBl\xC5\x19\xD7\x8D\xB6\x18\xEDJ\x1En"

If you use COPY without specifying the format 'CSV' postgres by default will assume format 'text'. This has a different interaction with backlashes, see text format.

If you're using COPY or a file_fdw make sure to specify format 'CSV' to avoid this kind of errors.

참고URL : https://stackoverflow.com/questions/1347646/postgres-error-on-insert-error-invalid-byte-sequence-for-encoding-utf8-0x0

반응형