上次探讨了常见的s
的情况,这种基本上很好理解!其中p表示该number的总长度,s为小数位。如果s为负数,则会取相应位数的取整。例如,如果number(4,-2),则数字1234的存储值为1200。关于这点在此就不多谈了!
下面来谈谈少见的p的情况。在这种情况下precision用来指定小数点之后的最大有效数字位数。当然不包括小数点后紧接着的0的个数。例如:
SQL> conn test/test@report
已连接。
SQL> create table test1(t1 number(4,5),t2 number(3,6),t3 number(2,4));
表已创建。
SQL> insert into test1(t1) values(0.123);
insert into test1(t1) values(0.123) *
ERROR 位于第 1 行:
ORA-01438: 值大于此列指定的允许精确度
SQL> insert into test1(t1) values(0.1234);
insert into test1(t1) values(0.1234)
*
ERROR 位于第 1 行:
ORA-01438: 值大于此列指定的允许精确度
SQL> insert into test1(t1) values(1.1234);
insert into test1(t1) values(1.1234)
*
ERROR 位于第 1 行:
ORA-01438: 值大于此列指定的允许精确度
SQL> insert into test1(t1) values(1.0234);
insert into test1(t1) values(1.0234)
*
ERROR 位于第 1 行:
ORA-01438: 值大于此列指定的允许精确度
以上这几种情况下,为什么会报错,答案将在后面揭晓!
SQL> insert into test1(t1) values(0.0234);
已创建 1 行。
SQL> insert into test1(t1) values(0.02341);
已创建 1 行。
SQL> insert into test1(t1) values(0.023412);
已创建 1 行。
SQL> select t1 from test1;
T1
----------
.0234
.02341
.02341
此处说明了,在p这种情况下,p是用来控制保存最大有效数字位的。而s是用来干什么的呢?下面用例子来说明:
SQL> insert into test1(t1) values(0.023411);
已创建 1 行。
SQL> insert into test1(t1) values(0.023418);
已创建 1 行。
SQL> select t1 from test1;
T1
----------
.0234
.02341
.02341
.02341
.02342
这就说明了,此种情况下的s是用来限制小数点后数字的位数的【当然也就包括小数点后紧接的0】。
回到上面insert时为什么会报错的问题分析?当在p这种情况下,插入的数据必须是小数,而且是符合一定规则的小数,先看看以下测试:
SQL> insert into test1(t1) values(1);
insert into test1(t1) values(1)
*
ERROR 位于第 1 行:
ORA-01438: 值大于此列指定的允许精确度
SQL> insert into test1(t1) values(10);
insert into test1(t1) values(10)
*
ERROR 位于第 1 行:
ORA-01438: 值大于此列指定的允许精确度
SQL> insert into test1(t1) values(10.1);
insert into test1(t1) values(10.1)
*
ERROR 位于第 1 行:
ORA-01438: 值大于此列指定的允许精确度
SQL> insert into test1(t1) values(10.01)
insert into test1(t1) values(10.01)
*
ERROR 位于第 1 行:
ORA-01438: 值大于此列指定的允许精确度
所以只能用来存放大于0小于1的小数。
再来看看下面的测试:
SQL> insert into test1(t1) values(0.1);
insert into test1(t1) values(0.1)
*
ERROR 位于第 1 行:
ORA-01438: 值大于此列指定的允许精确度
SQL> insert into test1(t1) values(0.01);
已创建 1 行。
SQL> insert into test1(t1) values(0.012);
已创建 1 行。
根据上面的3个insert可以看出,是不是插入的小数必须是小数点后第一位是0呢?接着看以下的test:
SQL> insert into test1(t2) values(0.012);
insert into test1(t2) values(0.012)
*
ERROR 位于第 1 行:
ORA-01438: 值大于此列指定的允许精确度
SQL> insert into test1(t2) values(0.0012);
insert into test1(t2) values(0.0012)
*
ERROR 位于第 1 行:
ORA-01438: 值大于此列指定的允许精确度
为什么此时还会报错呢?
其实小数点后面必须的0的数目取决于(s-p)的值,就是说此种情况下小数点后紧接着的0的数目至少有s-p个,不然不能正常插入。
SQL> insert into test1(t2) values(0.00012);
已创建 1 行。
SQL> insert into test1(t3) values(0.012);
insert into test1(t3) values(0.012)
*
ERROR 位于第 1 行:
ORA-01438: 值大于此列指定的允许精确度
SQL> insert into test1(t3) values(0.0012);
已创建 1 行。
总结:在p这种情况下
1、 p用来指定小数点之后的最大有效数字位数。当然不包括小数点后紧接着的0的个数。
2、 只能用来存放大于0小于1的小数。
3、 s是用来限制小数点后数字的位数的【当然也就包括小数点后紧接的0】。
4、 小数点后面必须的0的数目取决于(s-p)的值,就是说此种情况下小数点后紧接着的0的数目至少有s-p个,不然无法正常插入。
以上说法,如有不妥,请务必指出!
[@more@]来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9650775/viewspace-923321/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/9650775/viewspace-923321/
本文详细探讨了Oracle数据库中number类型的特殊存储规则,特别是在p和s参数定义下的小数存储特性,通过具体实例展示了不同数值在特定参数设置下的存储表现。
168万+

被折叠的 条评论
为什么被折叠?



