sql >> Databasteknik >  >> RDS >> Oracle

numeriskt spill med NULL kolumn (0,3)

Kolumnvärdet var inte null, det var korrupt. Den interna representationen som används för siffror är beskrivs i dokumentationen , eller olika andra platser som detta .

Den första byten är exponenten, och den kan - bara - vara noll, men inte med bara en 3:a efter den. Det närmaste jag tror du kan komma är 0,3,102 för -9,8*x10^125

Från dokumenten :

Så låt oss titta på hur vissa i de yttersta ändarna lagras:

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

Ditt dumpade värde på 0,3 har inte 102 i slutet som anger ett negativt tal, men om det var positivt skulle den första byten vara minst 128.

Det har förekommit fall av siffror som skadats av OCI-program som missköter dem, och till och med äldre import gör detsamma. Utan att veta hur data ursprungligen skapades kommer du förmodligen aldrig att veta exakt vad som gick fel, eller när, eller vad värdet ursprungligen var tänkt att vara.

Det är konstigt att SQL Developer visar null i resultatrutnätet (det verkar avbryta om du frågar som ett skript); i SQL*Plus visar det inget värde även om du set null till en fast sträng. SQL Developer, eller JDBC-drivrutinen, kanske bara tyst sväljer oförmågan att konvertera från intern representation.




  1. Får PHP-fel Varning:fputcsv() förväntar sig att parameter 2 är array

  2. findById() ger Inget egenskaps-ID hittat

  3. PostgreSQL - Uppdaterade tabellen i en funktion som jag skapade och nu har ordningen på raderna i tabellen ändrats

  4. Entity Framework 6 - Tidsfrågor