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