暂无图片
oracle里面number(20,2)数据类型,数据精度是20,小数位数是2。那它的数据长度是多少?
我来答
分享
暂无图片 匿名用户
oracle里面number(20,2)数据类型,数据精度是20,小数位数是2。那它的数据长度是多少?

oracle里面number(20,2)数据类型,数据精度是20,小数位数是2。那它的数据长度是多少?

我来答
添加附件
收藏
分享
问题补充
3条回答
默认
最新
吾喾
2022-02-11

20表示的是整数的位数,2表示的是小数点后的位数。

暂无图片 评论
暂无图片 有用 0
打赏 0
DarkAthena
2022-02-11
这个解释不对哦,20是表示有效位数,是整数部分和小数部分长度之和
DarkAthena
2022-02-11

首先要明确一点,
你指的是否是指该类型最长能容纳的长度?

还有是哪个长度?
人类可识别的字符长度?
还是指这个数据在数据库中存储的二进制数据的长度?
还是指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

image.png

第一个数字实际上是整数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
打赏 0
DarkAthena
答主
2022-02-11
https://www.modb.pro/db/253213
Thomas
2022-02-14

DarkAthena, 我有一个疑问,请教:从实际存储二进制数据那列看,十位数99对应的是一个字节,该字节对应了两个十六进制数,高位是6,低位是4,可是6X16+4=100,不是99啊。

暂无图片 评论
暂无图片 有用 0
打赏 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏