sql >> Databáze >  >> RDS >> Oracle

číselné přetečení sloupcem NULL (0,3)

Hodnota sloupce nebyla null, byla poškozená. Interní reprezentace použitá pro čísla je popsáno v dokumentaci , nebo na různých dalších místech jako toto .

První bajt je exponent a může být - jen - nula, ale ne pouze za 3. Myslím, že nejblíže je 0,3,102 pro -9,8*x10^125

Z dokumentů :

Podívejme se tedy, jak jsou uloženy některé na krajních koncích:

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

Vaše dumpingová hodnota 0,3 nemá na konci 102 označující záporné číslo, ale pokud by bylo kladné, první bajt by byl alespoň 128.

Vyskytly se případy, kdy byla čísla poškozena programy OCI, které s nimi špatně zacházely, a dokonce i starší import dělal totéž. Aniž byste věděli, jak byla data původně vytvořena, pravděpodobně nikdy nebudete přesně vědět, co se pokazilo, kdy nebo jaká měla být původně hodnota.

Je zvláštní, že SQL Developer zobrazuje v mřížce výsledků hodnotu null (zdá se, že se přeruší, pokud se dotazujete jako skript); v SQL*Plus neukazuje žádnou hodnotu, i když set null na pevný řetězec. SQL Developer nebo ovladač JDBC možná jen tiše polyká nemožnost převodu z interní reprezentace.




  1. Jak nainstalovat Azure Data Studio na Mac

  2. Kontingenční tabulka pomocí MySQL

  3. Získání duplicitního počtu při provádění INSERT IGNORE přes JDBC

  4. PHP webové stránky pro vyhledávání a zobrazování položek