在论坛看到一个有趣的帖子,是关于ORACLE的NUMBER类型溢出的。

Oracle的数值类型NUMBE包括0、正数和负数。

其中正数的范围是从1E-130到9.9999999999999999999999999999999999999E125。

而负数的范围是从-1E-130到-9.9999999999999999999999999999999999999E125。

Oracle的数值范围是由于NUMBER类型的存储结构决定的,下面看一下这些边界数值的DUMP值就会明白:

SQL> SELECT DUMP(1E-130) FROM DUAL;

DUMP(1E-130)

------------------

Typ=2 Len=2: 128,2

SQL> SELECT DUMP(0) FROM DUAL;

DUMP(0)

----------------

Typ=2 Len=1: 128

SQL> SELECT DUMP(9.9999999999999999999999999999999999999E125) B FROM DUAL;

B

-------------------------------------------------------------------------------------------

Typ=2 Len=20: 255,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100

SQL> SELECT DUMP(-1E-130) FROM DUAL;

DUMP(-1E-130)

------------------------

Typ=2 Len=3: 127,100,102

SQL> SELECT DUMP(-9.9999999999999999999999999999999999999E125) B FROM DUAL;

B

---------------------------------------------------------

Typ=2 Len=21: 0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,102

Oracle的NUMBER类型第一位表示的是数值的指数。128也就是一个字段最大值256的一半表示0,如果指数大于等于128,则表示正数,否则指数小于128则表示负数。因此正数的上线指数为255,正数的下线指数为128。

而负数的最大值指数为127,最小值指数为0。了解了这些也就清楚了NUMBER类型范围的由来。关于NUMBER类型的更详细描述,可以参考:

下面就可以看看溢出的情况了。

首先来看看最大的正数和最小的负数溢出情况:

SQL> SET NUMW 50

SQL> SELECT 9.9999999999999999999999999999999999999E125 FROM DUAL;

9.9999999999999999999999999999999999999E125

--------------------------------------------------

9.9999999999999999999999999999999999999000000E+125

SQL> SELECT DUMP(9.9999999999999999999999999999999999999E125) FROM DUAL;

DUMP(9.9999999999999999999999999999999999999E125)

--------------------------------------------------------------------------------------------

Typ=2 Len=20: 255,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100

设置NUMWIDTH是为了能在SQLPLUS中输出数位很长的数值。

根据Oracle文档,上面这个值是Oracle可以表示的最大的正数,但是由于负数有一个“排序位”,因此实际上NUMBER类型的长度可以达到21,也就是说,Oracle可以表示的正数最大值可以再增加两个9:

SQL> SELECT 9.99999999999999999999999999999999999999E125 FROM DUAL;

9.99999999999999999999999999999999999999E125

--------------------------------------------------

9.9999999999999999999999999999999999999900000E+125

SQL> SELECT DUMP(9.99999999999999999999999999999999999999E125) B FROM DUAL;

B

------------------------------------------------------------------------------------------------

Typ=2 Len=21: 255,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,91

SQL> SELECT 9.999999999999999999999999999999999999999E125 FROM DUAL;

9.999999999999999999999999999999999999999E125

--------------------------------------------------

9.9999999999999999999999999999999999999990000E+125

SQL> SELECT DUMP(9.999999999999999999999999999999999999999E125) B FROM DUAL;

B

-------------------------------------------------------------------------------------------------

Typ=2 Len=21: 255,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100,100

SQL> SELECT 9.9999999999999999999999999999999999999999E125 FROM DUAL;

SELECT 9.9999999999999999999999999999999999999999E125 FROM DUAL

*第1行出现错误:

ORA-01426:数字溢出

观察SELECT结果的有效数位就可以看到,Oracle实际上确实保存了40位有效数字。而当9的位数超过40,就会导致溢出。

同样的道理,现在来看最小的负数:

SQL> SELECT -9.9999999999999999999999999999999999999E125 FROM DUAL;

-9.9999999999999999999999999999999999999E125

--------------------------------------------------

-9.999999999999999999999999999999999999900000E+125

SQL> SELECT DUMP(-9.9999999999999999999999999999999999999E125) B FROM DUAL;

B

---------------------------------------------------------

Typ=2 Len=21: 0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,102

由于Oracle存在符号位,因此Oracle仍然可以使用符号位来记录数值:

SQL> SELECT -9.99999999999999999999999999999999999999E125 FROM DUAL;

-9.99999999999999999999999999999999999999E125

--------------------------------------------------

-9.999999999999999999999999999999999999990000E+125

SQL> SELECT DUMP(-9.99999999999999999999999999999999999999E125) B FROM DUAL;

B

--------------------------------------------------------

Typ=2 Len=21: 0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,11

SQL> SELECT -9.999999999999999999999999999999999999999E125 FROM DUAL;

-9.999999999999999999999999999999999999999E125

--------------------------------------------------

-9.999999999999999999999999999999999999999000E+125

SQL> SELECT DUMP(-9.999999999999999999999999999999999999999E125) B FROM DUAL;

B

-------------------------------------------------------

Typ=2 Len=21: 0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2

SQL> SELECT -9.9999999999999999999999999999999999999999E125 FROM DUAL;

SELECT -9.9999999999999999999999999999999999999999E125 FROM DUAL

*第1行出现错误:

ORA-01426:数字溢出

从这里看到,Oracle并非是在38位有效数值后溢出,而溢出值上限位40位有效数字。

oracle查询数字类溢出,有趣的数值溢出(一)相关推荐

  1. 【数值溢出】从二进制的角度看数值溢出

    编程语言中的数字数据类型都预设了大小,也就是说,一个数字数据类型的变量,总会有能表达的上限,有上限就会有溢出.本篇从二进制的底层,分析解释一下数值溢出问题.以byte为例. 0x01.问题引入 看如下 ...

  2. 数值溢出(arithmetic overflow)问题与解决方案

    0. 典型场景 两数相加(乘法).两数相减.一个数的阶乘,一个数的幂,这些统统可能造成数值的溢出: 避免数值溢出的方法: 当把一个计算出的很大的数赋值给一个 int(2^31-1)类型变量存储时,一般 ...

  3. Oracle查询字段以外的内容,Oracle查询字段内容为非数字的记录

    今天在一张3W多记录的表里查非数字的异常数据~数据库太水,记录一发,因为2.5使用人员误输入为2..5.... select t.routecardlist_id,trim(translate(RTR ...

  4. oracle查看列属性,oracle查询列属性

    oracle 动态查询列,查看oracle数据库的表名和列名,oracle查询列名,oracle查询列属性 oracle 查询动态列,查看oracle数据库的表名和列名,oracle查询列名,orac ...

  5. 生成特定于查询的类API摘要 (Generating Query-Specific Class API Summaries)

    链接:Generating query-specific class API summaries | Proceedings of the 2019 27th ACM Joint Meeting on ...

  6. oracle查询sql语句

    Oracle查询语句   select*from scott.emp ; 1.--dense_rank()分析函数(查找每个部门工资最高前三名员工信息) select*from(selectdeptn ...

  7. NC6 查询工具类 QueryUtil.java

    NC6 查询工具类 package nc.impl.am.db;import java.util.ArrayList; import java.util.Collections; import jav ...

  8. oracle的int范围,oracle中int类型和number类型区别

    oracle中int类型和number类型区别 INT类型是NUMBER类型的子类型. 下面简要说明: (1)NUMBER(P,S) 该数据类型用于定义数字类型的数据,其中P表示数字的总位数(最大字节 ...

  9. 应用安全系列之三十四:数值溢出

    应用程序中难免会遇到数字的处理,针对数字的处理如果不当也会造成严重的问题,著名的Heartbleed漏洞也是没有验证数字的有效性导致的. 数值处理不好的,轻则产生异常,重则影响整个程序的正常运行,因此 ...

  10. oracle取每日固定时间,Oracle查询每天固定时间段的数据

    select * from GPS_LOG t where to_char(t.gps_time,'hh24:mm:ss')>='15:30:00'and to_char(t.gps_time, ...

最新文章

  1. python内置库之学习ctypes库(一)
  2. python实现表格_零基础小白怎么用Python做表格?
  3. 构建轻量级的Table View注意事项[UIKit]
  4. 错误三次无法输入c语言,不懂就问,为啥错误输入三次不停止呢
  5. log4j升级到logback
  6. kafka依赖_kafka的简单学习
  7. 努力≠上进!那些持续精进的人有多可怕?
  8. 第 7 章 本地方法栈
  9. 阿里云云计算 34 RDS的概念
  10. Flash8-动态显示汉字乱码问题的解决
  11. VirtualBox中不能正常使用OpneGL的问题
  12. 三星手机投屏电脑教程 手机和电脑同屏
  13. SAP FICO全解析之-货币换算比率
  14. 公司银企对账怎么操作
  15. 阿里面试之Hr面,这个套路把我坑惨了......
  16. java上看小说软件_i悦读小说阅读软件 For java
  17. g6的minimap中的配置_g6 基本
  18. 微信小程序学习(一):开发准备、授权与验证
  19. 『CSS』CSS样式表的三种引入方式
  20. 第一篇 厚黑学 自 序

热门文章

  1. PL330 DMAC笔记(3) - 外设请求接口,事件和中断,Abort
  2. 苹果V10附件参数配置
  3. usb转并口支持linux,USB转并口;USB转真并口(支持仿真调试加密狗等);USB TO LPT
  4. redis--ServiceStack
  5. fbp是什么岗位_BP是什么职位?
  6. linux系统的负载
  7. phalapi门店管理系统插件,门店erp系统
  8. 蒙氏素材---创意时钟---三段卡 蒙氏教育
  9. 微信公众平台iPhone版开始内测了
  10. 微信公众平台深度开发JAVA版