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

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

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

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

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

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

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

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

暂无图片 评论
暂无图片 有用 0
打赏 0
回答交流
Markdown


请输入正文
提交
相关推荐
oracle怎么查询出哪个对象造成的大量归档?
回答 6
已采纳
我一般这么弄:1、查看产生归档的时间altersessionsetnlsdateformat'yyyymmddhh24:mi:ss';selectlpad(tochar(firsttime,'yyyy
oracle12c安装过程出现ADR setup (diagsetup) tool failed. Check the install log for more details错误
回答 2
从你的报错提示可以看到,少一个路径你在$ORACLEBASE/下面创建一个diag目录就可以了
字符集转换及设置
回答 6
尝试设置exportNLSLANGamericanamerica.al32utf8同时设置ssh客户端显示为gbk如果不行,可以同时设置以下两个试一下exportNLSLANGamericanamer
Oracle查出数据库用户多久未登录
回答 5
查询账号的最后登录时间selectt1.username,t1.logontimelastlogontime,t2.accountstatus,createdfrom(selectusername,m
kettle向分区表中的一个分区不能插入数据应该怎么排查
回答 1
把源表输出到excel或者csv,看看能不能生成数据。
请教各位大神。 我们这边用emc存储做的多路径,两组光纤做冗余,断了一组路径,数据库却宕机了。报错如下:
回答 5
看多路径配置
请教各位,oracle的表我有个字段已经删除了,但是数据字典里出来一个这字段,该如何去掉?
回答 3
应该是一个varchar列被设置了unused
Oracle 11g搭建的DG,可以用数据泵在备库上导数据吗?
回答 4
数据泵不能直接在屋里备库上导数据,导数据时数据泵会创建和维护一个表,需要写入权限,一般物理备库是readonly状态。如果一定要使用逻辑备份,建议使用exp操作
Oracle 单实例ASM机器被克隆后,克隆后的机器如何修改才能启动
回答 1
主机名尽量不修改,只修改IP地址就可以了,监听调整一下IP确认可以动态注册就可以提供对外的访问
Oracle的用rman做备份,有什么场景需要每隔十分钟要对本机做一次增量备份?
回答 8
如果是客户提的要求还可以理解呵!