Oracle
 sql >> Base de données >  >> RDS >> Oracle

débordement numérique avec colonne NULL (0,3)

La valeur de la colonne n'était pas nulle, elle était corrompue. La représentation interne utilisée pour les nombres est décrit dans la documentation , ou divers autres endroits comme celui-ci .

Le premier octet est l'exposant, et il peut - juste - être zéro, mais pas avec seulement un 3 le suivant. Le plus proche que je pense que vous puissiez obtenir est 0,3,102 pour -9.8*x10^125

De la documentation :

Voyons donc comment certains sont stockés aux extrémités :

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

Votre valeur de dumping de 0,3 n'a pas le 102 à la fin indiquant un nombre négatif, mais s'il était positif, le premier octet serait au moins 128.

Il y a eu des cas où des numéros ont été corrompus par des programmes OCI qui les ont mal gérés, et même une importation héritée a fait de même. Sans savoir comment les données ont été créées à l'origine, vous ne saurez probablement jamais exactement ce qui s'est mal passé, ni quand, ni quelle était la valeur à l'origine.

Il est étrange que SQL Developer affiche null dans la grille de résultats (il semble abandonner si vous interrogez en tant que script); dans SQL*Plus, il n'affiche aucune valeur même si vous set null à une chaîne fixe. SQL Developer, ou le pilote JDBC, peut simplement avaler silencieusement l'incapacité de convertir à partir de la représentation interne.