programing

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

goodsources 2023. 5. 16. 22:34
반응형

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

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

입력 데이터에서 모든 null 문자를 수동으로 제거해야 합니까?저를 위해 우체국 직원들이 이것을 할 수 있는 방법이 있나요?

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 문자를 저장해야 하는 경우 원하는 모든 항목을 저장해야 하지만 텍스트 작업을 지원하지 않는 필드를 사용해야 합니다.

포스트그레를 생각하면,SQL은 텍스트 값으로 지원하지 않으므로 SQL을 제거할 수 있는 좋은 방법이 없습니다.데이터를 바이트a로 가져온 다음 나중에 특수 함수(펄 등)를 사용하여 텍스트로 변환할 수 있지만 로드하기 전에 전처리에서 이 작업을 수행하는 것이 더 쉬울 수 있습니다.

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

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

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

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

각각:

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

null 바이트를 정규화합니다.

s/\x00//g;

오직 이 정규식만이 나에게 효과가 있었습니다.

sed 's/\\0//g'

데이터를 가져올 때 다음을 수행합니다.$ get_data | sed 's/\\0//g'데이터를 출력할 수 있습니다.0x00

다음 기능을 사용하여 먼저 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();

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

삽입 전:

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

선택 후:

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

"null"을 Some Very Special로 사용했습니다.값에 "null" 문자열이 전혀 없을 것으로 확신하는 텍스트입니다.

복사를 사용하고 NULL 값을 포함하는 이스케이프 문자열이 있을 때도 이러한 종류의 오류가 발생할 수 있습니다.00 ) 예:

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

사용하는 경우COPYformat 'CSV'는 "postgres"로 합니다.format 'text'백래시와의 상호 작용은 다릅니다. 텍스트 형식을 참조하십시오.

를 사용하는 COPY 는또.file_fdw "는"을 지정해야 합니다.format 'CSV'이런 종류의 오류를 방지하기 위해.

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

반응형