该列值不为空,它已损坏。用于数字的内部表示是文档中描述 https://docs.oracle.com/en/database/oracle/oracle-database/12.2/lnoci/data-types.html#GUID-91151345-2C67-41BC-A782-AD4816B89BCF,或其他各种地方像这样 http://www.jlcomp.demon.co.uk/number_format.html.
第一个字节是指数,它可以是零,但不能只跟随一个 3。我认为你能得到的最接近的是0,3,102
对于-9.8*x10^125
来自文档 https://docs.oracle.com/en/database/oracle/oracle-database/12.2/sqlrf/Data-Types.html#GUID-75209AF6-476D-4C44-A5DC-5FA70D701B78:
NUMBER 数据类型存储零以及绝对值从 1.0 x 10^-130 到(但不包括 1.0 x 10^126)的正负固定数。
那么让我们看看最末端的一些是如何存储的:
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
如果指定算术表达式,其值的绝对值大于或等于 1.0 x 10126,则 Oracle 将返回错误。
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 驱动程序可能只是默默地接受无法从内部表示进行转换的事实。