Persönlich würde ich CHR()
um die Nullwerte zu identifizieren. Eine Null ist eine ASCII 0 und CHR()
gibt die Zeichendarstellung der eingegebenen Zahl zurück.
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
Wie Sie sehen können, indem Sie Prozentzeichen um CHR(0)
verketten (was nul entspricht) können Sie Zeilen mit nul in zurückgeben.
DUMP()
gibt den Datentyp zurück (1 bedeutet VARCHAR2 ) die Länge des Strings in Bytes und die interne Darstellung der Daten; der Standardwert ist binär.
Allerdings müssen Sie bei Multibyte-Daten vorsichtig sein als CHR()
gibt das Zeichenäquivalent des Moduls von 256 der Zahl:
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
Wie Sie sehen, würden Sie hier fälschlicherweise eine Null identifizieren, indem Sie entweder CHR()
verwenden oder DUMP()
Mit anderen Worten, wenn Sie keine Multibyte-Daten haben, ist es am einfachsten, ersetzen es:
update <table>
set <column> = replace(<column>, chr(0));
Verwendung von RAWTOHEX()
hat ähnliche Probleme; obwohl Sie den 00
finden können es gibt keine Garantie, dass es tatsächlich eine Null ist:
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
Es hat tatsächlich noch ein weiteres Problem; Stellen Sie sich vor, Sie hätten zwei Zeichen 10
und 06
der zurückgegebene Wert ist dann 1006
und Sie finden 00
. Wenn Sie diese Methode verwenden, müssen Sie sicherstellen, dass Sie nur zwei Zeichengruppen vom Anfang des Strings betrachten.
Da die interne Darstellung eines Nullzeichens verwendet wird, um Teile anderer Multibyte-Zeichen darzustellen, können Sie sie nicht einfach ersetzen, da Sie nicht wissen, ob es sich um ein Zeichen oder ein halbes Zeichen handelt. Wenn Sie also einen Multibyte-Zeichensatz verwenden, können Sie dies meines Wissens nicht tun.