2009-08-28 13 views

risposta

39

PostgreSQL non supporta la memorizzazione NULL (\ 0x00) caratteri in campi di testo (questo è ovviamente diversa dal valore NULL database, che è completamente supportato).

Fonte: http://www.postgresql.org/docs/9.1/static/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS-UESCAPE

Se avete bisogno di memorizzare il carattere NULL, è necessario utilizzare un campo bytea - che dovrebbe immagazzinare tutto quello che vuoi, ma non supporterà operazioni di testo su di esso.

Dato che PostgreSQL non lo supporta nei valori di testo, non c'è un buon modo per rimuoverlo. Potresti importare i tuoi dati in bytea e poi convertirli in testo usando una funzione speciale (in perl o qualcosa del genere, forse?), Ma è probabile che sia più facile farlo in pre-elaborazione prima di caricarlo.

+0

Esempio: 'CREATE store_bytes tabella ( INTERO chiave NOT NULL , dati bytea NOT NULL ); ' – zengr

1

È possibile prima inserire i dati nel campo blob e quindi copiare al campo di testo con la funzione 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

Basta REGEX fuori byte nulli:

s/\x00//g; 
+1

è una stringa vuota considerata come un byte null? Will 'replaceAll (" s/\ x00 // g "," ")' ha come risultato la sostituzione con altri null? –

+2

Le stringhe vuote non sono considerate byte null. I valori byte nulli sono caratteri reali, ma invisibili. –

4

Se si utilizza Java, è possibile semplicemente sostituire i caratteri x00 prima dell'inserto come segue:

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

La soluzione è stato fornito e spiegato di Csaba in seguente post:

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

Rispettivamente:

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'.

Problemi correlati