场景:在做一次字段扩长的时候,需要和生产数据作对比.于是用以下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官方技术团队给出答案

关于NUMBER类型的长度和精度的解释

NUMBER数据类型的部分答疑,挺有阅读价值

这里简单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只是可以声明的最大约束.

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐