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
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ộ.