sql >> Base de Datos >  >> RDS >> Oracle

desbordamiento numérico con columna NULL (0,3)

El valor de la columna no era nulo, estaba corrupto. La representación interna utilizada para los números es descrito en la documentación , o varios otros lugares como este .

El primer byte es el exponente, y puede, simplemente, ser cero, pero no con solo un 3 siguiéndolo. Creo que lo más cerca que puedes llegar es 0,3,102 para -9,8*x10^125

De los documentos :

Entonces, veamos cómo se almacenan algunos en los extremos:

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

Tu valor descargado de 0,3 no tiene el 102 al final que indica un número negativo, pero si fuera positivo, el primer byte sería al menos 128.

Ha habido casos de números corrompidos por programas OCI que los manejaron mal, e incluso la importación heredada hizo lo mismo. Sin saber cómo se crearon originalmente los datos, probablemente nunca sabrá exactamente qué salió mal, cuándo o cuál se suponía que era el valor originalmente.

Es extraño que SQL Developer muestre nulo en la cuadrícula de resultados (parece abortar si consulta como un script); en SQL*Plus no muestra ningún valor incluso si set null a una cadena fija. SQL Developer, o el controlador JDBC, pueden estar tragando silenciosamente la incapacidad de convertir desde la representación interna.