Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

tràn số với cột NULL (0,3)

Giá trị cột không phải là null, nó đã bị hỏng. Biểu diễn nội bộ được sử dụng cho các số là được mô tả trong tài liệu hoặc nhiều nơi khác như thế này .

Byte đầu tiên là số mũ, và nó có thể - chỉ - bằng 0, nhưng không chỉ có 3 theo sau nó. Gần nhất tôi nghĩ bạn có thể nhận được là 0,3,102 cho -9,8 * x10 ^ 125

Từ tài liệu :

Vì vậy, hãy xem cách một số ở các đầu cực được lưu trữ:

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

Giá trị kết xuất của bạn là 0,3 không có 102 ở cuối biểu thị một số âm, nhưng nếu nó là số dương, byte đầu tiên sẽ ít nhất là 128.

Đã có những trường hợp số bị hỏng do các chương trình OCI xử lý sai, và thậm chí việc nhập kế thừa cũng làm như vậy. Nếu không biết cách dữ liệu ban đầu được tạo ra, có thể bạn sẽ không bao giờ biết chính xác điều gì đã xảy ra, hoặc khi nào, hoặc giá trị ban đầu được cho là như thế nào.

Thật kỳ lạ khi Nhà phát triển SQL hiển thị null trong lưới kết quả (có vẻ như bị hủy bỏ nếu bạn truy vấn dưới dạng tập lệnh); trong SQL * Plus, nó không hiển thị giá trị ngay cả khi bạn set null thành một chuỗi cố định. SQL Developer, hoặc trình điều khiển JDBC, có thể đang âm thầm nuốt chửng không có khả năng chuyển đổi từ biểu diễn nội bộ.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bảng tổng hợp có các giá trị không chính yếu

  2. Truy vấn mối quan hệ Khoá ngoại của Bảng

  3. Lặp lại một Tập kết quả bằng JDBC cho Oracle mất rất nhiều thời gian khoảng 16 giây?

  4. Cách gọi hàm băm Oracle MD5?

  5. ORA-00937:Không phải là một hàm nhóm đơn - Lỗi truy vấn