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

overflow numerico con colonna NULL (0,3)

Il valore della colonna non era nullo, era danneggiato. La rappresentazione interna utilizzata per i numeri è descritto nella documentazione , o vari altri posti come questo .

Il primo byte è l'esponente e può - solo - essere zero, ma non seguito solo da un 3. Il più vicino che penso tu possa ottenere è 0,3,102 per -9,8*x10^125

Dai documenti :

Quindi diamo un'occhiata a come vengono archiviati alcuni alle estremità estreme:

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

Il tuo valore di dumping di 0,3 non ha il 102 alla fine che denota un numero negativo, ma se fosse positivo il primo byte sarebbe almeno 128.

Ci sono stati casi in cui i numeri sono stati corrotti da programmi OCI che li hanno gestiti in modo errato e persino l'importazione legacy ha fatto lo stesso. Senza sapere come sono stati originariamente creati i dati, probabilmente non saprai mai esattamente cosa è andato storto, quando o quale valore doveva essere originariamente.

È strano che SQL Developer mostri null nella griglia dei risultati (sembra interrompersi se si esegue una query come script); in SQL*Plus non mostra alcun valore anche se set null ad una stringa fissa. SQL Developer, o il driver JDBC, potrebbe semplicemente ingoiare silenziosamente l'impossibilità di convertire dalla rappresentazione interna.