Kolonneværdien var ikke null, den var korrupt. Den interne repræsentation, der bruges til tal er beskrevet i dokumentationen , eller forskellige andre steder som dette .
Den første byte er eksponenten, og den kan - bare - være nul, men ikke med kun en 3'er efter den. Det nærmeste jeg tror du kan komme er 0,3,102
for -9,8*x10^125
Så lad os se på, hvordan nogle i de yderste ender opbevares:
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
Din dumpede værdi på 0,3
har ikke 102 i slutningen, der angiver et negativt tal, men hvis det var positivt, ville den første byte være mindst 128.
Der har været tilfælde af numre, der er blevet ødelagt af OCI-programmer, der har misbrugt dem, og endda ældre import gør det samme. Uden at vide, hvordan dataene oprindeligt blev oprettet, vil du sandsynligvis aldrig vide præcis, hvad der gik galt, eller hvornår, eller hvad værdien oprindeligt skulle være.
Det er mærkeligt, at SQL Developer viser null i resultatgitteret (det ser ud til at afbryde, hvis du forespørger som et script); i SQL*Plus viser den ingen værdi, selvom du set null
til en fast streng. SQL-udvikleren eller JDBC-driveren sluger måske bare lydløst manglende evne til at konvertere fra intern repræsentation.