Hodnota sloupce nebyla null, byla poškozená. Interní reprezentace použitá pro čísla je popsáno v dokumentaci , nebo na různých dalších místech jako toto .
První bajt je exponent a může být - jen - nula, ale ne pouze za 3. Myslím, že nejblíže je 0,3,102
pro -9,8*x10^125
Podívejme se tedy, jak jsou uloženy některé na krajních koncích:
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
Vaše dumpingová hodnota 0,3
nemá na konci 102 označující záporné číslo, ale pokud by bylo kladné, první bajt by byl alespoň 128.
Vyskytly se případy, kdy byla čísla poškozena programy OCI, které s nimi špatně zacházely, a dokonce i starší import dělal totéž. Aniž byste věděli, jak byla data původně vytvořena, pravděpodobně nikdy nebudete přesně vědět, co se pokazilo, kdy nebo jaká měla být původně hodnota.
Je zvláštní, že SQL Developer zobrazuje v mřížce výsledků hodnotu null (zdá se, že se přeruší, pokud se dotazujete jako skript); v SQL*Plus neukazuje žádnou hodnotu, i když set null
na pevný řetězec. SQL Developer nebo ovladač JDBC možná jen tiše polyká nemožnost převodu z interní reprezentace.