
oracle里面number(20,2)数据类型,数据精度是20,小数位数是2。那它的数据长度是多少?
oracle里面number(20,2)数据类型,数据精度是20,小数位数是2。那它的数据长度是多少?
我来答
添加附件
收藏
复制链接
微信扫码分享

在小程序上查看
分享
添加附件
问题补充
3条回答
默认
最新
20表示的是整数的位数,2表示的是小数点后的位数。


打赏 0
这个解释不对哦,20是表示有效位数,是整数部分和小数部分长度之和
采纳答案后不可修改和取消
首先要明确一点,
你指的是否是指该类型最长能容纳的长度?
还有是哪个长度?
人类可识别的字符长度?
还是指这个数据在数据库中存储的二进制数据的长度?
还是指length函数能识别的长度?
先做一个实验,看看number(20,2)中的20和2分别表示什么
create table num_test (a number(20,2));
insert into num_test values (99999999999999999999);-- 20个9,报错,大于指定精度
insert into num_test values (9999999999999999999);-- 19个9,报错,大于指定精度
insert into num_test values (999999999999999999);-- 18个9,正常插入
insert into num_test values (999999999999999999.99);--整数18个9,小数两个9,正常插入
insert into num_test values (999999999999999999.123456);--整数18个9,小数6位,正常插入
insert into num_test values (-123.4);
insert into num_test values (-0.5);
insert into num_test values (900000000000000000)
--查询
select a,
to_char(a),
length(a) 字符长度,
utl_raw.cast_from_number(a) 实际存储二进制数据,
utl_raw.length( utl_raw.cast_from_number(a)) 实际存储字节长度
from num_test
第一个数字实际上是整数18个9,小数两个0,to_char函数自动把小数部分的0去掉了
然后length函数,如果是传入数字,实际上是先隐式的进行了to_char,再来判断的字符串长度,如果是负数,它甚至负号都要算长度
如果整数部分是0,to_char不会保留整数部分的0,因此length(-0.50)实际上是 length(’-.5’)=3
所以number类型的长度不能用length字符长度来衡量,而应该用所占字节数更为精确。
假设20位精度占满,全部非0,那么最大存储的字节长度应该为 20/2+1=11个字节,因为number类型的二进制数据,第一个字节是指数(表示数据量级和正负),后面的字节,每个字节按一百进,比如十进制99表示数值的部分占1个字节,但101表示数值的部分要占2个字节。最后末尾的0可以去掉,所以最后那行看上去那么长,实际上也只存了2个字节,即指数一个字节,十进制数值90 一个字节
我最近正在写的一篇文章里会提到这个number类型的二进制数据是怎么计算的,敬请期待


打赏 0
https://www.modb.pro/db/253213
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
