Nilai kolom bukan nol, tetapi rusak. Representasi internal yang digunakan untuk angka adalah dijelaskan dalam dokumentasi , atau berbagai tempat lain seperti ini .
Byte pertama adalah eksponen, dan itu bisa - hanya - menjadi nol, tetapi tidak hanya dengan 3 yang mengikutinya. Yang paling dekat menurut saya adalah 0,3,102
untuk -9.8*x10^125
Jadi mari kita lihat bagaimana beberapa di ujung ekstrim disimpan:
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
Nilai 0,3
Anda yang dibuang tidak memiliki 102 di akhir yang menunjukkan angka negatif, tetapi jika positif, byte pertama setidaknya 128.
Ada beberapa contoh nomor yang rusak oleh program OCI yang salah menanganinya, dan bahkan impor warisan melakukan hal yang sama. Tanpa mengetahui bagaimana data awalnya dibuat, Anda mungkin tidak akan pernah tahu persis apa yang salah, atau kapan, atau nilai awalnya seharusnya.
Aneh bahwa Pengembang SQL menunjukkan nol di kisi hasil (tampaknya dibatalkan jika Anda meminta sebagai skrip); di SQL*Plus itu tidak menunjukkan nilai bahkan jika Anda set null
ke string tetap. Pengembang SQL, atau driver JDBC, mungkin diam-diam menelan ketidakmampuan untuk mengonversi dari representasi internal.