Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

luapan numerik dengan kolom NULL (0,3)

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

Dari dokumen :

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. RESULT_CACHE kosong RESULT_ON

  2. Mengapa memilih kolom yang ditentukan, dan semuanya, salah di Oracle SQL?

  3. Oracle - Transpose baris menjadi kolom

  4. Konversikan tanggal String ISO-8601 ke tipe data stempel waktu Oracle

  5. GALAT:ORA-00917:koma hilang saat menggunakan Hibernate dengan urutan yang ada di Oracle