Osobně bych použil CHR()
k identifikaci hodnot nul. A nul je ASCII 0 a CHR() vrátí znakové vyjádření čísla, které předáte.
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
Jak můžete vidět zřetězením znaků procenta kolem CHR(0) (což je ekvivalentní nul) můžete vrátit řádky s nul in.
DUMP()
vrátí datový typ (1 znamená VARCHAR2 ) délka řetězce v bajtech a vnitřní reprezentace dat; výchozí je binární.
Nicméně je třeba dávat pozor na vícebajtová data jako CHR() vrátí znakový ekvivalent modulu 256 čísla:
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
Jak vidíte, omylem byste zde identifikovali nul pomocí buď CHR() nebo DUMP()
Jinými slovy, pokud nemáte vícebajtová data, nejjednodušší je jednoduše nahradit to:
update <table>
set <column> = replace(<column>, chr(0));
Pomocí RAWTOHEX() má podobné problémy; i když můžete najít 00 neexistuje žádná záruka, že je to skutečně nula:
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
Ve skutečnosti má také další problém; představte si, že máte dva znaky 10 a 06 vrácená hodnota je pak 1006 a najdete 00 . Pokud byste použili tuto metodu, musíte se ujistit, že jste se podívali pouze na dvě skupiny znaků od začátku řetězce.
Protože se vnitřní reprezentace znaku nul používá k reprezentaci částí jiných, vícebajtových znaků, nemůžete je jednoduše nahradit, protože nevíte, zda se jedná o jeden znak nebo polovinu znaku. Pokud tedy používáte vícebajtovou znakovou sadu, pokud vím, nebudete toho schopni.