2009-08-28 20 views

cevap

39

(\ 0x00) metin alanlarındaki karakterleri (bu tam olarak desteklenir veritabanı NULL değeri, belli ki farklıdır).

Kaynak: Eğer BOŞ karakteri saklamak gerekiyorsa http://www.postgresql.org/docs/9.1/static/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS-UESCAPE

, bir bytea alanını kullanmalıdır - İstediğin her şeyi saklamak hangi, ama o metin işlemlerini desteklemeyeceğiz.

PostgreSQL'in metin değerlerinde desteklemediği göz önüne alındığında, onu kaldırmak için iyi bir yol yoktur. Verilerinizi bytea'ya aktarabilir ve daha sonra özel bir işlev (perl veya bir şey, belki de?) Kullanarak metne dönüştürebilirsiniz, ancak yüklemeden önce ön işlemede bunu yapmak daha kolay olacaktır.

+0

Örnek: 'TABLO store_bytes CREATE ( anahtar TAMSAYILI NULL , veri bytea NOT NULL ); ' – zengr

1

Önce damla alanına veri eklemek ve sonra folloing fonksiyonu ile metin alanına kopyalayabilirsiniz

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

Sadece dışarı regex boş bayt:

s/\x00//g; 
+1

boş dize boş bayt olarak kabul edilir mi? DeğiştirmezAll ("s/\ x00 // g", "") 'onları başka null'larla değiştirmeye neden olur? –

+2

Boş dizeler boş bayt olarak kabul edilmez. Boş bayt değerleri gerçek karakterlerdir, ancak görünmezdir. –

4

Java kullanıyorsanız, aşağıdaki gibi eklemeden önce x00 karakterlerini değiştirebilirsiniz:

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

çözeltisi ardından aşağıda verilir ve Csaba tarafından açıklanmıştır:

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

sırasıyla:

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