Oracle
 sql >> Database >  >> RDS >> Oracle

Come sbarazzarsi dei caratteri NUL nel database Oracle?

Personalmente userei CHR() per identificare i valori nulli. Un null è un ASCII 0 e CHR() restituirà la rappresentazione del carattere del numero che hai passato.

SQL> with the_data as (
  2  select 'a' || chr(0) || 'b' as str from dual
  3   union all
  4  select 'a' || 'c' from dual
  5         )
  6  select dump(str)
  7    from the_data
  8   where str like '%' || chr(0) || '%'
  9         ;

DUMP(STR)
----------------------------------------------------    
Typ=1 Len=3: 97,0,98

Come puoi vedere concatenando i segni di percentuale attorno a CHR(0) (che equivale a null) puoi restituire righe con null in.

DUMP() restituisce il tipo di dati (1 significa VARCHAR2 ) la lunghezza della stringa in byte e la rappresentazione interna dei dati; il valore predefinito è binario.

Tuttavia, devi fare attenzione con i dati multibyte come CHR() restituisce il carattere equivalente del modulo di 256 del numero:

SQL> with the_data as (
  2  select 'a' || chr(0) || 'b' as str from dual
  3   union all
  4  select 'a' || chr(256) || 'c' from dual
  5         )
  6  select dump(str)
  7    from the_data
  8   where str like '%' || chr(0) || '%'
  9         ;

DUMP(STR)
-------------------------------------------------
Typ=1 Len=3: 97,0,98
Typ=1 Len=4: 97,1,0,99

Come puoi vedere, identificheresti erroneamente un null qui, usando CHR() o DUMP()

In altre parole, se non si dispone di dati multibyte, la cosa più semplice da fare è semplicemente sostituisci esso:

update <table>
   set <column> = replace(<column>, chr(0));

Utilizzando RAWTOHEX() ha problemi simili; anche se puoi trovare il 00 non vi è alcuna garanzia che sia effettivamente un null:

SQL> with the_data as (
  2  select 'a' || chr(0) || 'b' as str from dual
  3   union all
  4  select 'a' || chr(256) || 'c' from dual
  5         )
  6  select rawtohex(str)
  7    from the_data
  8   where str like '%' || chr(0) || '%'
  9         ;

RAWTOHEX
--------
610062
61010063

In realtà ha anche un ulteriore problema; immagina di avere due caratteri 10 e 06 il valore restituito è quindi 1006 e troverai 00 . Se dovessi usare questo metodo devi assicurarti di guardare solo due gruppi di caratteri, dall'inizio della stringa.

Poiché la rappresentazione interna di un carattere null viene utilizzata per rappresentare parti di altri caratteri multibyte, non puoi semplicemente sostituirli poiché non sai se si tratta di un carattere o di mezzo carattere. Quindi, se stai usando un set di caratteri multibyte, per quanto ne so, non sarai in grado di farlo.