Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Numerischer Überlauf mit NULL-Spalte (0,3)

Der Spaltenwert war nicht null, er war beschädigt. Die für Zahlen verwendete interne Darstellung ist in der Dokumentation beschrieben , oder an verschiedenen anderen Orten so .

Das erste Byte ist der Exponent, und es kann - nur - Null sein, aber nicht nur eine 3, die darauf folgt. Ich denke, das nächste, was Sie erreichen können, ist 0,3,102 für -9,8*x10^125

Aus der Dokumentation :

Schauen wir uns also an, wie einige an den äußersten Enden gespeichert werden:

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

Ihr gedumpter Wert von 0,3 hat die 102 am Ende keine negative Zahl, aber wenn es positiv wäre, wäre das erste Byte mindestens 128.

Es gab Fälle, in denen Nummern durch OCI-Programme beschädigt wurden, die sie falsch handhabten, und sogar Legacy-Importe taten dasselbe. Ohne zu wissen, wie die Daten ursprünglich erstellt wurden, werden Sie wahrscheinlich nie genau wissen, was schief gelaufen ist, oder wann, oder was der Wert ursprünglich sein sollte.

Es ist seltsam, dass SQL Developer im Ergebnisraster null anzeigt (es scheint abzubrechen, wenn Sie als Skript abfragen); in SQL*Plus zeigt es keinen Wert, selbst wenn Sie set null zu einer festen Saite. SQL Developer oder der JDBC-Treiber schlucken möglicherweise einfach stillschweigend die Unfähigkeit, von der internen Darstellung zu konvertieren.