关于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 数据类型中的精度和小数位数是啥意思