sql >> Database >  >> RDS >> Oracle

Hoe zich te ontdoen van NUL-tekens in de Oracle-database?

Persoonlijk zou ik CHR() om de nulwaarden te identificeren. Een nul is een ASCII 0 en CHR() geeft de tekenweergave terug van het nummer dat u doorgeeft.

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

Zoals je kunt zien door percentagetekens rond CHR(0) te plaatsen (wat gelijk is aan nul) je kunt rijen retourneren met de nul erin.

DUMP() geeft het gegevenstype terug (1 betekent VARCHAR2 ) de lengte van de string in bytes en de interne representatie van de gegevens; de standaard is binair.

u moet echter voorzichtig zijn met multibyte-gegevens als CHR() geeft het tekenequivalent van de modulus van 256 van het getal terug:

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

Zoals je kunt zien, zou je hier ten onrechte een nul identificeren, met behulp van CHR() of DUMP()

Met andere woorden, als u geen multibyte-gegevens hebt, is het eenvoudigst vervangen het:

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

Gebruikmakend van RAWTOHEX() heeft soortgelijke problemen; hoewel je de 00 . kunt vinden er is geen garantie dat het echt een nul is:

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

Het heeft eigenlijk nog een ander probleem; stel je voor dat je twee tekens had 10 en 06 de geretourneerde waarde is dan 1006 en je vindt 00 . Als u deze methode zou gebruiken, moet u ervoor zorgen dat u vanaf het begin van de tekenreeks slechts naar twee tekengroepen kijkt.

Omdat de interne representatie van een nul-teken wordt gebruikt om delen van andere, multibyte-tekens weer te geven, kun je ze niet zomaar vervangen omdat je niet weet of het een teken of een half teken is. Dus als je een multibyte-tekenset gebruikt, kun je dit, voor zover ik weet, niet doen.



  1. Dynamisch mysql select Query maken

  2. hoe te controleren of de aangepaste tabel van WordPress leeg is of niet

  3. Verschil in benodigde tijd om InnoDB/MyISAM-records in te voegen

  4. User_id-waarde delen tussen twee MySql-tabel