Personligt ville jeg bruge CHR()
for at identificere nulværdierne. Et nul er en ASCII 0 og CHR()
returnerer tegnrepræsentationen af det tal, du sender ind.
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
Som du kan se ved at sammenkæde procenttegn omkring CHR(0)
(som svarer til nul) kan du returnere rækker med nul i.
DUMP()
returnerer datatypen (1 betyder VARCHAR2 ) længden af strengen i bytes og den interne repræsentation af dataene; standarden er binær.
Men du skal være forsigtig med multibyte-data som CHR()
returnerer tegnækvivalenten til modulet på 256 af tallet:
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
Som du kan se, ville du fejlagtigt identificere et nul her ved at bruge enten CHR()
eller DUMP()
Med andre ord, hvis du ikke har multibyte-data, er den nemmeste ting at gøre simpelthen erstat det:
update <table>
set <column> = replace(<column>, chr(0));
Bruger RAWTOHEX()
har lignende problemer; selvom du kan finde 00
der er ingen garanti for, at det faktisk er et nul:
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
Det har faktisk også et yderligere problem; Forestil dig, at du havde to tegn 10
og 06
den returnerede værdi er så 1006
og du finder 00
. Hvis du skulle bruge denne metode, skal du sikre dig, at du kun kiggede på to tegngrupper fra begyndelsen af strengen.
Da den interne repræsentation af et nul-tegn bruges til at repræsentere dele af andre multibyte-tegn, kan du ikke bare erstatte dem, da du ikke ved, om det er et tegn eller et halvt tegn. Så hvis du bruger et multibyte tegnsæt, vil du, så vidt jeg ved, ikke være i stand til at gøre dette.