2009-08-28 43 views

Respuesta

39

PostgreSQL no es compatible con el almacenamiento NULL (\ 0x00) caracteres en los campos de texto (esto es obviamente diferente de la base de datos de valor nulo, que está totalmente soportada).

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

Si necesita almacenar el carácter nulo, debe utilizar un campo bytea - que debe guardar todo lo que quieras, pero no va a apoyar operaciones de texto en él.

Dado que PostgreSQL no lo admite en valores de texto, no hay una buena manera de que lo elimine. Podrías importar tus datos en bytea y luego convertirlos a texto usando una función especial (en Perl o algo así, tal vez?), Pero es probable que sea más fácil hacer eso en el preprocesamiento antes de cargarlo.

+0

Ejemplo: 'CREATE store_bytes mesa ( INTEGER clave no NULL , datos bytea NOT NULL ); ' – zengr

1

primera Puede insertar datos en campo blob y luego copiar al campo de texto con la función 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ólo expresiones regulares a cabo bytes nulos:

s/\x00//g; 
+1

es una cadena vacía considerada como un byte nulo? ¿No 'replaceAll ("s/\ x00 // g", "") 'dará como resultado reemplazarlos por otros nulos? –

+2

Las cadenas vacías no se consideran bytes nulos. Los valores de byte nulo son caracteres reales, pero invisibles. –

4

Si está utilizando Java, puede reemplazar los x00 caracteres antes de la inserción como se indica a continuación:

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

se proporcionó a la solución y explica por Csaba en siguiente mensaje:

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

Respectivamente:

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

Cuestiones relacionadas