2009-08-28 8 views

답변

39

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 또는 기타의 경우)?하지만로드하기 전에 사전 처리에서이를 수행하는 것이 더 쉽습니다.

+0

예 : 는'표 store_bytes를 CREATE ( 키 INTEGER NULL NOT , 데이터 바이트가 아닌 NULL ), ' – zengr

1

먼저 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(); 
15

그냥 정규식 널 바이트 :

s/\x00//g; 
+1

은 null 문자열로 간주되는 빈 문자열입니까? 'replaceAll ("s/\ x00 // g", "")'이 다른 null로 바뀌지 않을까요? –

+2

빈 문자열은 null 바이트로 간주되지 않습니다. Null 바이트 값은 실제 문자이지만 보이지 않습니다. –

4

자바를 사용하는 경우 다음과 같이 삽입하기 전에 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'.

관련 문제