如果我在oracle中声明一个列作为数字,它可以存储的最大数量是多少? 基于文档:
正数在1 x 10(凸起)-130到9.99 ... 9 x 10(凸起)125范围内 到38位有效数字
10(凸起)125是一个非常大的数字,有超过38位数。它不会存储吗?如果存储的数字大于38位,则会失败?它会保存,但查询时会失去精确度吗?
由于
答案 0 :(得分:1)
正数在1 x 10 ^ 130到9.99 ... 9 x 10 ^ 125范围内 到38位有效数字负数从-1 x 10 ^ 130到 9.99 ... 99 x 10 ^ 125,最多38位有效数字
测试
create table tbl(clm number);
insert into tbl select power(10, -130) from dual;
insert into tbl select 9.9999*power(10, 125) from dual;
insert into tbl select 0.12345678912345678912345678912345678912123456 from dual;
insert into tbl select -1*power(10, -130) from dual;
select clm from tbl;
select to_char(clm) from tbl;
输出
1.000000000000000000000000000000000E-130
9.999900000000000000000000000000000E+125
.123456789123456789123456789123456789121
-1.00000000000000000000000000000000E-130
答案 1 :(得分:0)
即。 1000000为1 * 10 ^ 6,即您只存储1(尾数)和6(指数)
select VSIZE(1000000), VSIZE(1000001) from dual;
VSIZE(1000000) VSIZE(1000001)
-------------- --------------
2 5
对于第一个数字,您只需要1个字节用于尾数,对于第二个4个字节(每个字节2个二进制数字)。
因此,使用 NUMBER ,您将在开始松开精度时获得异常。
select power(2,136) from dual;
87112285931760246646623899502532662132700
这个数字不准确,而且#34;填充"用零(指数)。这可能有害也可能没有害处 - 例如考虑MOD功能:
select mod(power(2,136),2) from dual;
-100
如果你想控制精确度,请使用例如数据类型 NUMBER(38,0)
select cast(power(2,136) as NUMBER(38,0)) from dual;
ORA-01438: value larger than specified precision allowed for this column