Oracle number类型使用解读

 更新时间:2025年09月02日 09:48:09   作者:trayvontang  
Oracle的NUMBER类型通过precision(有效位数)和scale(小数位数)精确控制数值存储,与MySQL的DECIMAL类型类似但更细粒度,能优化存储空间和性能

简介

Oracle的number类型比较复杂,很多限制,但是掌握一点小技巧就能轻松搞定。

基本说明

number(precision,scale)

  1. precision表示数字中的有效位,从左边第一个不为0的数算起,小数点和负号不计入有效位数
  2. precision的取值范围是[1,38]
  3. precision默认值为38,number等价于number(38)
  4. scale大于0,表示数字精确到小数点右边的位数,number(2,3)表示精确到小数点左边3位
  5. scale小于0,表示数字取舍到小数点左边的位数,number(3,-2)表示四色五人到百位,123,变为100
  6. scale的取值范围是[-84,127]
  7. scale默认值为0
  8. number整数部分允许的最大长度为precision-scale
  9. number整数部分的长度 大于 precision-scale 时出错,例如number(3,2)就不能存12.34,因为精度不够
  10. number小数部分的长度 大于 scale时,就会对小数部分多出来的位数四舍五入,例如number(3,1),存储3.1415的时候就会存3.1
  11. scale为负数时,对小数点左边的sacle个数字进行四舍五入,如number(5,-3),存储1234567.89,存储值为1235000,可以看到0没有占有有效位

违背第一直觉的项来了:

scale 大于 precision 时, precision表示小数点后第scale位向左最多可以有多少位数字,如果大于p则出错错,小数点后s位向右的数字四舍五入。

换个思路,换个说法,也许就好理解了。scale大于precision的时候,小数部分的精度大于整个数的精度只可能是一种情况,这个数就是小数,并且多半是0.00…xx这种。

例如,number(2,3),小数部分有3位,但是数据只能精确两位,那就只能存0.012这种,只需存12两位有效数字,如果是0.12这种就存不了,因为0.12三位有效数字就是0.120,存不了这么多位。

容易出错情况

  1. number(8),存储1234567.89是没有问题,因为没有定义小数位,小数位被舍弃合理
  2. number(6),不能存储1234567.89,虽然没有存储小数位,但是整数位也不够
  3. number(9,3),不能存储1234567.89,虽然精度是9位,但是定义了小数位占了3位,只有6位整数位,1234567有7位
  4. number(7,2),不能存储1234567.89,没啥好说的,精度不够,7位不足以存储9位数字
  5. number(2,3),不能存储0.23,小数部分有3位有效数字,0.230,精度只有2位,不足以存储

Number与MySQL数据类型

MySQL数据类型字节大小范围-有符号范围-无符号oracle number
tinyint1 bytes(-128,127)(0,255)number(3)
smallint2 bytes(-32 768,32 767)(0,65 535)number(5)
mediumint3 bytes(-8 388 608,8 388 607)(0,16 777 215)number(8)
integer4 bytes(-2 147 483 648,2 147 483 647)(0,4 294 967 295)number(10)
bigint8 bytes(-9,223,372,036,854,775,808,9 223 372 036 854 775 807)(0,18 446 744 073 709 551 615)number(20)

Oracle的number和MySQL的decimal非常像,但是在数据类型上区分的更细,能更好的利用存储空间,提高性能。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Oracle 12C实现跨网络传输数据库详解

    Oracle 12C实现跨网络传输数据库详解

    这篇文章主要给大家介绍了关于Oracle 12C实现跨网络传输数据库的相关资料,文中介绍的非常详细,相信对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-06-06
  • 详解Oracle的sqlldr理论

    详解Oracle的sqlldr理论

    这篇文章主要介绍了详解Oracle的sqlldr理论,SQL*LOADER是ORACLE的数据加载工具,通常用来将操作系统文件(数据)迁移到ORACLE数据库中,SQL*LOADER是大型数据仓库选择使用的加载方法,因为它提供了最快速的途径(DIRECT,PARALLEL),需要的朋友可以参考下
    2023-07-07
  • oracle数据库删除数据Delete语句和Truncate语句的使用比较

    oracle数据库删除数据Delete语句和Truncate语句的使用比较

    oracle当表中的数据不需要时,则应该删除该数据并释放所占用的空间,删除表中的数据可以使用Delete语句或者Truncate语句,下面分别介绍
    2012-09-09
  • Oracle删除重复的数据,Oracle数据去重复

    Oracle删除重复的数据,Oracle数据去重复

    这篇文章主要介绍了Oracle删除重复的数据,Oracle数据去重复,需要的朋友可以参考下
    2016-08-08
  • oracle中误删除表后恢复语句(FLASHBACK)

    oracle中误删除表后恢复语句(FLASHBACK)

    在操作过程中难免会误操作,出现这种情况应该怎样解决呢?不要着急,下面与大家分享下误删的恢复语句
    2013-06-06
  • Oracle向量搜索功能测试报告详解

    Oracle向量搜索功能测试报告详解

    这篇文章主要介绍了Oracle向量搜索功能测试报告的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2026-03-03
  • Oracle通过sqlplus连接数据库的方式

    Oracle通过sqlplus连接数据库的方式

    今天小编就为大家分享一篇关于Oracle通过sqlplus连接数据库的方式,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • oracle—SQL技巧之(一)连续记录查询sql案例测试

    oracle—SQL技巧之(一)连续记录查询sql案例测试

    有这样一个需求:需要查询出某个客户某一年那些天是有连续办理过业务,本文给予sql实现语句并测试,感兴趣的朋友可以了解下
    2013-01-01
  • Oracle ORA-00904:标识符无效解决方法(太坑了!!)

    Oracle ORA-00904:标识符无效解决方法(太坑了!!)

    最近执行sql时oracle报错ORA-00904:标识符无效,所以这篇文章主要给大家介绍了关于Oracle ORA-00904:标识符无效解决方法的相关资料,需要的朋友可以参考下
    2022-10-10
  • 详细聊聊Oracle表碎片对性能有多大的影响

    详细聊聊Oracle表碎片对性能有多大的影响

    当针对一个表的删除操作很多时,表会产生大量碎片,下面这篇文章主要给大家介绍了关于Oracle表碎片对性能影响的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-03-03

最新评论