삽입시 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.
'IT Share you' 카테고리의 다른 글
웹 API POST 본문 객체는 항상 null입니다. (0) | 2020.12.02 |
---|---|
C ++-십진수를 이진으로 변환 (0) | 2020.12.02 |
segfault 커널 로그 메시지를 읽는 방법 (0) | 2020.12.01 |
GraphViz에서 범례 / 키 만들기 (0) | 2020.12.01 |
피클과 선반의 차이점은 무엇입니까? (0) | 2020.12.01 |