sql >> Database >  >> RDS >> Oracle

numerieke overloop met NULL-kolom (0,3)

De kolomwaarde was niet null, deze was beschadigd. De interne representatie die wordt gebruikt voor getallen is beschreven in de documentatie , of verschillende andere plaatsen zoals deze .

De eerste byte is de exponent, en deze kan - gewoon - nul zijn, maar niet met alleen een 3 erachter. Het dichtst dat ik denk dat je kunt krijgen is 0,3,102 voor -9,8*x10^125

Uit de documenten :

Dus laten we eens kijken hoe sommige aan de uiterste uiteinden worden opgeslagen:

with t (n) as (
            select  1 * power(10, -130) from dual
  union all select  1 * power(10, 125) from dual
  union all select -1 * power(10, -130) from dual
  union all select -1 * power(10, 125) from dual
  union all select -9.7 * power(10, 125) from dual
  union all select -9.8 * power(10, 125) from dual
  union all select -9.85 * power(10, 125) from dual
  union all select -9.9 * power(10, 125) from dual
)
select n, dump(n) d1, dump(n, 1016) d2 from t

          N D1                             D2
----------- ------------------------------ ------------------------------
 1.000E-130 Typ=2 Len=2: 128,2             Typ=2 Len=2: 80,2
 1.000E+125 Typ=2 Len=2: 255,11            Typ=2 Len=2: ff,b
-1.000E-130 Typ=2 Len=3: 127,100,102       Typ=2 Len=3: 7f,64,66
-1.000E+125 Typ=2 Len=3: 0,91,102          Typ=2 Len=3: 0,5b,66
-9.700E+125 Typ=2 Len=3: 0,4,102           Typ=2 Len=3: 0,4,66
-9.800E+125 Typ=2 Len=3: 0,3,102           Typ=2 Len=3: 0,3,66
-9.850E+125 Typ=2 Len=4: 0,3,51,102        Typ=2 Len=4: 0,3,33,66
-9.900E+125 Typ=2 Len=3: 0,2,102           Typ=2 Len=3: 0,2,66
select  1 * power(10, 126) from dual;

ORA-01426: numeric overflow

Uw gedumpte waarde van 0,3 heeft niet de 102 aan het einde die een negatief getal aangeeft, maar als het positief was, zou de eerste byte minstens 128 zijn.

Er zijn gevallen geweest van nummers die werden beschadigd door OCI-programma's die ze verkeerd behandelden, en zelfs oudere import deed hetzelfde. Zonder te weten hoe de gegevens oorspronkelijk zijn gemaakt, weet u waarschijnlijk nooit precies wat er mis is gegaan, of wanneer, of wat de waarde oorspronkelijk had moeten zijn.

Het is vreemd dat SQL Developer null toont in het resultatenraster (het lijkt af te breken als je een query uitvoert als een script); in SQL*Plus toont het geen waarde, zelfs niet als u set null naar een vaste snaar. SQL Developer, of het JDBC-stuurprogramma, slikt misschien stilletjes het onvermogen om te converteren vanuit interne representatie.




  1. ORA-01775:doorlopende reeks synoniemen

  2. Krijg SELECT-resultaten gesorteerd op rij-ID in mySQL

  3. Oracle -- waarden vinden met voorloop- of volgspaties

  4. SQL - Hoe een rij te selecteren met een kolom met maximale waarde