oraclenumber类型是啥意思?新手一看就懂的解释来了!

吉云

大家今天想跟大家唠唠我在用Oracle数据库时跟NUMBER这个类型打交道的一些经历。搞数据库嘛存数字是家常便饭,一开始我也没太在意,觉得不就是存个数嘛能有多复杂?

初次接触与简单使用

刚开始接触Oracle的时候,建表需要存数字,比如用户ID、订单数量什么的。我看文档或者别人写的脚本,很多时候就直接写个NUMBER,后面啥也不跟。试了试,好像整数、小数都能存进去,感觉挺方便。比如我定义一个字段叫product_count NUMBER,然后存个100、存个1000都没问题。后来又试着存价格,比如99.9,也能存进去。当时就觉得,这NUMBER挺“傻瓜”的,不用我想太多。

oraclenumber类型是啥意思?新手一看就懂的解释来了!

遇到问题:精度和范围

用着用着,问题就来了。有一次是处理财务相关的数据,要求特别精确,比如金额要保留两位小数。我就发现,直接用NUMBER有时候它显示的小数位数不一定是我想要的,或者我需要限制一下数字的大小,不能让用户随便输个天文数字进来。

这时候我就得去研究NUMBER后面那俩括号里的参数了,就是NUMBER(p, s)这玩意儿。

搞懂 `p` 和 `s`

p (Precision) - 总位数

这个p,我一开始理解有点偏,后来才搞明白,它指的是这个数字总共能有多少个有效数字。注意是有效数字,从左边第一个不是零的数开始算,小数点、正负号不算在里面。比如NUMBER(5),就能存12345,也能存-12345,还能存123.45(1、2、3、4、5,一共5位有效数字)。但你要是想存123456,那就不行了,位数超了。

如果我不指定ps,直接用NUMBER,Oracle会给它一个很大的默认精度,好像是38位,一般情况下是足够用了,但有时候为了明确约束,或者节省一点点存储空间(虽然现在硬盘便宜了,但好习惯还是要养成),最好还是指定一下。

s (Scale) - 小数位数

这个s就好理解多了,就是小数点后面能有几位。这个在存钱的时候特别有用。

  • NUMBER(10, 2):这是我存金额最常用的。总共最多10位有效数字,其中2位是小数。比如1234567.89,刚刚如果存123.456,它会四舍五入变成123.46存进去。
  • NUMBER(8, 0):如果我确定只要存整数,比如商品数量、用户积分什么的,我就会用这个。s是0,意思就是没有小数位。你存99进去就是99,你要是硬塞个99.8进去,它就给你四舍五入变成100。

比较怪的 `s` 为负数

还有一种情况,就是s可以是负数。这个我一开始也觉得奇怪,啥意思?后来试了下,比如NUMBER(5, -2),你存个12345进去,它会给你四舍五入到百位,变成12300。这个负数s的意思就是,把小数点左边的几位进行四舍五入。老实说,我实践中用得非常少,感觉有点绕,一般也用不上。

实践中的选择

我现在建表用NUMBER类型时,基本上会根据实际情况来定ps

  • 存钱,一般就是NUMBER(10, 2)或者NUMBER(12, 2),看金额大概范围。
  • 存数量、ID这类整数,就用NUMBER(p, 0),比如NUMBER(8, 0)NUMBER(10, 0)p给够用就行。
  • 如果是不确定范围,或者需要非常高精度的科学计算(虽然我业务里碰得少),可能就直接用NUMBER,让它用默认的38位精度。

Oracle的NUMBER类型确实挺强大的,也很灵活,能适应各种数字存储需求。只要搞清楚了ps这两个参数是咋回事,根据实际场景选择合适的定义,用起来还是很顺手的。不像有些数据库,整数、小数、大数搞一堆类型让你选,Oracle一个NUMBER基本就都搞定了。

好了,今天就先分享这么多关于NUMBER类型实践中的一点体会,希望能帮到大家。下次再聊点别的。

免责声明:由于无法甄别是否为投稿用户创作以及文章的准确性,本站尊重并保护知识产权,根据《信息网络传播权保护条例》,如我们转载的作品侵犯了您的权利,请您通知我们,请将本侵权页面网址发送邮件到qingge@88.com,深感抱歉,我们会做删除处理。

目录[+]