Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie werden NUL-Zeichen in der Oracle-Datenbank entfernt?

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:

zurück
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.