Wartość kolumny nie była null, była uszkodzona. Wewnętrzna reprezentacja używana dla liczb to opisane w dokumentacji , lub różne inne miejsca takie jak to .
Pierwszy bajt jest wykładnikiem i może - po prostu - być zerem, ale nie tylko z trzema następującymi po nim. Najbliżej, jak sądzę, możesz uzyskać to 0,3,102
za -9,8*x10^125
Przyjrzyjmy się więc, jak przechowywane są niektóre skrajne końce:
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
Twoja zrzucona wartość 0,3
nie ma 102 na końcu oznaczającego liczbę ujemną, ale gdyby była dodatnia, pierwszy bajt miałby co najmniej 128.
Zdarzały się przypadki uszkadzania numerów przez programy OCI, które niewłaściwie się z nimi obchodziły, a nawet importowanie starszej wersji robiło to samo. Bez wiedzy, w jaki sposób dane zostały pierwotnie utworzone, prawdopodobnie nigdy nie dowiesz się dokładnie, co poszło nie tak, kiedy lub jaka pierwotnie miała być wartość.
Dziwne, że SQL Developer pokazuje null w siatce wyników (wydaje się, że nie działa, jeśli zapytanie jest wykonywane jako skrypt); w SQL*Plus nie pokazuje żadnej wartości, nawet jeśli set null
do ustalonego ciągu. SQL Developer lub sterownik JDBC może po prostu po cichu przełykać niemożność konwersji z wewnętrznej reprezentacji.