삽입 시 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"
사용하는 경우COPY
를 format '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
'programing' 카테고리의 다른 글
안드로이드 스튜디오 대 이클립스 + ADT 플러그인? (0) | 2023.05.21 |
---|---|
npm ERR cb()가 호출되지 않았습니다. (0) | 2023.05.16 |
psql에서 데이터베이스를 전환하는 방법은 무엇입니까? (0) | 2023.05.16 |
GitHub 저장소에 파일과 폴더를 추가하려면 어떻게 해야 합니까? (0) | 2023.05.16 |
목록 슬라이싱을 사용하여 목록에서 첫 번째 요소를 제외한 모든 요소를 가져오는 방법 (0) | 2023.05.16 |