mysql에서 데이터를 postgres에 삽입 할 때 다음 오류가 발생합니다.삽입시 Postgres 오류 - 오류 : "UTF8"인코딩의 바이트 시퀀스가 잘못되었습니다 : 0x00
입력 데이터에서 모든 null 문자를 수동으로 제거해야합니까? postgres가 나를 대신 할 수있는 방법이 있습니까?
ERROR: invalid byte sequence for encoding "UTF8": 0x00
mysql에서 데이터를 postgres에 삽입 할 때 다음 오류가 발생합니다.삽입시 Postgres 오류 - 오류 : "UTF8"인코딩의 바이트 시퀀스가 잘못되었습니다 : 0x00
입력 데이터에서 모든 null 문자를 수동으로 제거해야합니까? postgres가 나를 대신 할 수있는 방법이 있습니까?
ERROR: invalid byte sequence for encoding "UTF8": 0x00
PostgreSQL은 텍스트 필드에 NULL (\ 0x00) 문자를 저장하는 것을 지원하지 않습니다 (완전히 지원되는 데이터베이스 NULL 값과는 분명히 다릅니다).
출처 : 당신이 NULL 문자를 저장해야하는 경우 http://www.postgresql.org/docs/9.1/static/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS-UESCAPE
, 당신은 bytea와 필드를 사용합니다 - 당신이 원하는 무엇이든을 저장해야하는,하지만의 텍스트 작업을 지원하지 않습니다.
PostgreSQL이 텍스트 값에서이를 지원하지 않는다면, 그것을 제거하기위한 좋은 방법이 없습니다. 데이터를 bytea로 가져 와서 나중에 특수 기능을 사용하여 텍스트로 변환 할 수 있습니다 (perl 또는 기타의 경우)?하지만로드하기 전에 사전 처리에서이를 수행하는 것이 더 쉽습니다.
먼저 BLOB 필드에 데이터를 삽입 한 다음 folloing 기능을 텍스트 필드에 복사 할 수 있습니다
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();
그냥 정규식 널 바이트 :
s/\x00//g;
은 null 문자열로 간주되는 빈 문자열입니까? 'replaceAll ("s/\ x00 // g", "")'이 다른 null로 바뀌지 않을까요? –
빈 문자열은 null 바이트로 간주되지 않습니다. Null 바이트 값은 실제 문자이지만 보이지 않습니다. –
자바를 사용하는 경우 다음과 같이 삽입하기 전에 x00 문자를 바꿀 수 있습니다.
myValue.replaceAll("\u0000", "")
이 솔루션은 다음 게시물에 제공 사바에 의해 설명되었다 :
https://www.postgresql.org/message-id/1171970019.3101.328.camel%40coppola.muc.ecircle.de
각각 :
in Java you can actually have a "0x0" character in your string, and that's valid unicode. So that's translated to the character 0x0 in UTF8, which in turn is not accepted because the server uses null terminated strings... so the only way is to make sure your strings don't contain the character '\u0000'.
예 : 는'표 store_bytes를 CREATE ( 키 INTEGER NULL NOT , 데이터 바이트가 아닌 NULL ), ' – zengr