关于oracle中number类型的长度和精度的一点整理.mark

Posted oneDayOnePureSmile

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于oracle中number类型的长度和精度的一点整理.mark相关的知识,希望对你有一定的参考价值。

场景:在做一次字段扩长的时候,需要和生产数据作对比.于是用以下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只是可以声明的最大约束.

oracle number类型

NUMBER类型详细介绍:

在Oracle中Number类型可以用来存储0,正负定点或者浮点数,可表示的数据范围在

1.0 * 10(-130) —— 9.9...9 * 10(125) {38个9后边带88个0}

的数字,当Oracle中的数学表达式的值>=1.0*10(126)时,Oracle就会报错。

Number的数据声明如下:

定点数的精度(p)和刻度(s)遵循以下规则:

当一个数的整数部分的长度> p-s 时,Oracle就会报错

当一个数的小数部分的长度> s 时,Oracle就会舍入。

当s(scale)为负数时,Oracle就对小数点左边的s个数字进行舍入。

当s > p时, p表示小数点后第s位向左最多可以有多少位数字,如果大于p则Oracle报错,小数点后s位向右的数字被舍入.

以上是关于关于oracle中number类型的长度和精度的一点整理.mark的主要内容,如果未能解决你的问题,请参考以下文章

在oracle中number类型的字段长度是啥意思

留意oracle中integer和number的区别

oracle中直接定义number类型不带括号究竟含不含小数或负数

说知道oracle中int类型和number类型区别

oracle number类型

Oracle NUMBER 数据类型中的精度和小数位数是啥意思