sql >> Database teknologi >  >> RDS >> Oracle

numerisk overløb med NULL kolonne (0,3)

Kolonneværdien var ikke null, den var korrupt. Den interne repræsentation, der bruges til tal er beskrevet i dokumentationen , eller forskellige andre steder som dette .

Den første byte er eksponenten, og den kan - bare - være nul, men ikke med kun en 3'er efter den. Det nærmeste jeg tror du kan komme er 0,3,102 for -9,8*x10^125

Fra dokumenterne :

Så lad os se på, hvordan nogle i de yderste ender opbevares:

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

Din dumpede værdi på 0,3 har ikke 102 i slutningen, der angiver et negativt tal, men hvis det var positivt, ville den første byte være mindst 128.

Der har været tilfælde af numre, der er blevet ødelagt af OCI-programmer, der har misbrugt dem, og endda ældre import gør det samme. Uden at vide, hvordan dataene oprindeligt blev oprettet, vil du sandsynligvis aldrig vide præcis, hvad der gik galt, eller hvornår, eller hvad værdien oprindeligt skulle være.

Det er mærkeligt, at SQL Developer viser null i resultatgitteret (det ser ud til at afbryde, hvis du forespørger som et script); i SQL*Plus viser den ingen værdi, selvom du set null til en fast streng. SQL-udvikleren eller JDBC-driveren sluger måske bare lydløst manglende evne til at konvertere fra intern repræsentation.




  1. Hvordan konverterer man en streng til dato i MySQL?

  2. Brug af Babel i produktionen - Sådan prækompilerer du scripts

  3. Få størrelsen på flere tabeller i én forespørgsel POSTGRES?

  4. yii2 hvordan man bruger søgning med sqldataProvider