sql >> Databasteknik >  >> RDS >> Oracle

Hur blir man av med NUL-tecken i Oracle-databasen?

Personligen skulle jag använda CHR() för att identifiera nullvärdena. Ett nul är en ASCII 0 och CHR() returnerar teckenrepresentationen för numret du skickar in.

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 genom att sammanfoga procenttecken runt CHR(0) (vilket motsvarar nul) kan du returnera rader med nul i.

DUMP() returnerar datatypen (1 betyder VARCHAR2 ) strängens längd i byte och den interna representationen av data; standardinställningen är binär.

Men du måste vara försiktig med multibyte-data som CHR() returnerar teckenekvivalenten till modulen för 256 för talet:

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 skulle du av misstag identifiera en nul här, med antingen CHR() eller DUMP()

Med andra ord, om du inte har multibyte-data är det enklaste att göra helt enkelt ersätt det:

update <table>
   set <column> = replace(<column>, chr(0));

Använder RAWTOHEX() har liknande problem; även om du kan hitta 00 det finns ingen garanti för att det faktiskt är en 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 faktiskt ett ytterligare problem också; tänk dig att du hade två tecken 10 och 06 det returnerade värdet är då 1006 och du hittar 00 . Om du skulle använda den här metoden måste du se till att du bara tittade på två teckengrupper, från början av strängen.

Eftersom den interna representationen av ett nolltecken används för att representera delar av andra multibyte-tecken, kan du inte bara ersätta dem eftersom du inte vet om det är ett tecken eller ett halvt tecken. Så om du använder en multibyte-teckenuppsättning kommer du, så vitt jag vet, inte att kunna göra detta.



  1. Hur man får månad med hjälp av datum i MySQL

  2. Python Pandas to_sql, hur skapar man en tabell med en primärnyckel?

  3. hur man kontrollerar att databasen är konsekvent efter ofullständig återställning

  4. MS Access Corruption Del 2:Bästa metoder för förebyggande och återhämtning