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.