Oracle
 sql >> база данни >  >> RDS >> Oracle

цифрово препълване с NULL колона (0,3)

Стойността на колоната не беше нула, беше повредена. Вътрешното представяне, използвано за числа, е описано в документацията , или различни други места като това .

Първият байт е показателят и той може - просто - да бъде нула, но не само с 3 след него. Най-близкото според мен, което можете да получите, е 0,3,102 за -9,8*x10^125

От документите :

Така че нека да разгледаме как се съхраняват някои в най-крайните краища:

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

Вашата изхвърлена стойност от 0,3 няма 102 в края, което означава отрицателно число, но ако е положително, първият байт ще бъде поне 128.

Има случаи на повредени номера от програми на OCI, които ги боравят неправилно, и дори наследен импорт прави същото. Без да знаете как първоначално са създадени данните, вероятно никога няма да разберете какво точно се е объркало, или кога, или каква е трябвало да бъде първоначалната стойност.

Странно е, че SQL Developer показва null в мрежата с резултати (изглежда прекъсва, ако заявите като скрипт); в SQL*Plus не показва стойност дори ако set null към фиксиран низ. SQL Developer или JDBC драйверът може просто мълчаливо да преглъща невъзможността за конвертиране от вътрешно представяне.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Динамична дължина на числов формат в to_number Oracle SQL

  2. Сравнете низ в Oracle Case When

  3. % влиза в PreparedStatement на Java

  4. В oracle, как да променя сесията си да показва UTF8?

  5. Как да използвам CREATE OR REPLACE?