关于oracle中number类型的长度和精度的一点整理.mark
场景:在做一次字段扩长的时候,需要和生产数据作对比.于是用以下SQL查询了一下该字段的长度.SELECTCOLUMN_NAME,DATA_LENGTH,DATA_PRECISION,DATA_SCALEFROMUSER_TAB_COLUMNSWHERETABLE_NAME='TEST_NUMBER'; --这里是测试表.表字段分别为A ->NUMBER(38)B->......
场景:在做一次字段扩长的时候,需要和生产数据作对比.于是用以下SQL查询了一下该字段的长度.
SELECT
COLUMN_NAME,DATA_LENGTH,DATA_PRECISION,DATA_SCALE
FROM
USER_TAB_COLUMNS
WHERE
TABLE_NAME='TEST_NUMBER'; --这里是测试表.
表字段分别为
A -> NUMBER(38)
B -> NUMBER
C -> NUMBER(18,2).
查询结果为:
COLUMN_NAME DATA_LENGTH DATA_PRECISION DATA_SCALE
A 22 38 0
B 22
C 22 18 2
到这里,身为菜鸟的我产生了一丝疑惑.为啥所有的NUMBER类型长度都为22.不应该是NUMBER(18,2)长度就是18么?
后来带着疑惑,去查了下ORACLE官方,找到了答案.以下这两个是ORACLE官方技术团队给出答案
这里简单CTRL+C,CTRL+V出来.大概就是说,
一、NUMBER长度与精度
ORACLE的字节码长度为22.其中20个字节用来存储数据.而每个字节的字长既不是计算机常用的二进制计算的,也不是我们我熟悉的十进制计算的,更不是程序中常用的十六进制计算的,而是100进制计算.
WTF?头回见到100进制,除了震惊、震惊还是TM的震惊.
也就是说,ORACLE的最大数字(也就是最大有效精度)为99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99,99
总共20个99,也就是40个9. 所以ORACLE的最大有效精度为40位.
二、NUMBER(38)和NUMBER的区别.
文档中指出,NUMBER(38)的38只是一种格式、一个完整性约束.
也就是说你可以约束这个字段最大数字为NUMBER(38),再往上就报错了.
如果你不添加任何约束,而是使用NUMBER去定义这个字段.那么它的长度将是很长、很长、很长.
最长可达到125位.但它的最大有效精度只有40位.超过40位,倒也能存进去,只是无法精确到数字了.
比如41位的9 减去 (34位的9和1位的8) , 结果是0.已经无法进行正确计算了啊喂.
不过据我所知.NUMBER超过15位,也就是达到16位就已经不太好计算了,会有问题.
不过哪来的那么有钱的客户,做这么大金额的交易呢.
最后一点
NUMBER最大有效精度是40,不是38. 38只是可以声明的最大约束.
NUMBER最大有效精度是40,不是38. 38只是可以声明的最大约束.
NUMBER最大有效精度是40,不是38. 38只是可以声明的最大约束.
更多推荐
所有评论(0)