Oracle
 sql >> Baza danych >  >> RDS >> Oracle

przepełnienie liczbowe z kolumną NULL (0,3)

Wartość kolumny nie była null, była uszkodzona. Wewnętrzna reprezentacja używana dla liczb to opisane w dokumentacji , lub różne inne miejsca takie jak to .

Pierwszy bajt jest wykładnikiem i może - po prostu - być zerem, ale nie tylko z trzema następującymi po nim. Najbliżej, jak sądzę, możesz uzyskać to 0,3,102 za -9,8*x10^125

Z dokumentacji :

Przyjrzyjmy się więc, jak przechowywane są niektóre skrajne końce:

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

Twoja zrzucona wartość 0,3 nie ma 102 na końcu oznaczającego liczbę ujemną, ale gdyby była dodatnia, pierwszy bajt miałby co najmniej 128.

Zdarzały się przypadki uszkadzania numerów przez programy OCI, które niewłaściwie się z nimi obchodziły, a nawet importowanie starszej wersji robiło to samo. Bez wiedzy, w jaki sposób dane zostały pierwotnie utworzone, prawdopodobnie nigdy nie dowiesz się dokładnie, co poszło nie tak, kiedy lub jaka pierwotnie miała być wartość.

Dziwne, że SQL Developer pokazuje null w siatce wyników (wydaje się, że nie działa, jeśli zapytanie jest wykonywane jako skrypt); w SQL*Plus nie pokazuje żadnej wartości, nawet jeśli set null do ustalonego ciągu. SQL Developer lub sterownik JDBC może po prostu po cichu przełykać niemożność konwersji z wewnętrznej reprezentacji.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wyciek pamięci dzięki OracleCommand

  2. Jak obsłużyć kolumnę tabeli nazwaną zarezerwowanym słowem kluczowym Sql?

  3. Używanie instrukcji case w ograniczeniu sprawdzającym

  4. HikariCP przechodzi typ niestandardowy Oracle

  5. java.sql.SQLException:ORA-01438: