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
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.