sql >> Database teknologi >  >> RDS >> Oracle

Hvordan slippe af med NUL-tegn i Oracle-databasen?

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.



  1. bruger foreach to do batch-indsættelse med mybatis

  2. Postgres-forbindelsen er langsom fra PHP

  3. Hvordan kunne denne forespørgsel forbedres?

  4. Importerer data fra csv-fil