zoukankan      html  css  js  c++  java
  • [20191002]函数dump的bug.txt

    [20191002]函数dump的bug.txt

    --//前几天写raw转化oracle number脚本,在使用函数dump时遇到一些问题,做一个记录:
    --//oracle number 0 编码 是80,大于80是正数.

    1.环境:
    SCOTT@test01p> @ ver1

    PORT_STRING                    VERSION        BANNER                                                                               CON_ID
    ------------------------------ -------------- -------------------------------------------------------------------------------- ----------
    IBMPC/WIN_NT64-9.1.0           12.2.0.1.0     Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production              0

    2.dump 函数问题.

    SCOTT@test01p> select dump(1e-130,16) from dual ;

    DUMP(1E-130,16)
    -----------------
    Typ=2 Len=2: 80,2

    SCOTT@test01p> select dump(1e-131,16) from dual ;
    DUMP(1E-131,16)
    ---------------
    Typ=2 Len=1: 80   --> 实际上是0.

    --//但是如果输入:
    SCOTT@test01p> select dump(to_number('.'||lpad('0',129,'0')||'1'),16) from dual;
    DUMP(TO_NUMBER('.
    -----------------
    Typ=2 Len=2: 80,2
    --//正确!!

    SCOTT@test01p> select dump(to_number('.'||lpad('0',130,'0')||'1'),16) from dual;
    DUMP(TO_NUMBER('.
    -----------------
    Typ=2 Len=2: 7f,b

    SCOTT@test01p> select dump(to_number('.'||lpad('0',131,'0')||'1'),16) from dual;
    DUMP(TO_NUMBER('.
    -----------------
    Typ=2 Len=2: 7f,2

    SCOTT@test01p> select dump(to_number('.'||lpad('0',132,'0')||'1'),16) from dual;
    DUMP(TO_NUMBER('.
    -----------------
    Typ=2 Len=2: 7e,b

    SCOTT@test01p> select dump(to_number('.'||lpad('0',232,'0')||'1'),16) from dual;
    DUMP(TO_NUMBER('.
    -----------------
    Typ=2 Len=2: 4c,b

    --//很明显dump输入的数字没有采用科学计数法并且等于1e-131,1e-132存在bug.显示7f,2以及7e,b明显有问题.变成负数并且后面没有0x66.
    --//可以将转化的编码是非法的.
    --//to_number('.'||lpad('0',132,'0')||'1') = 1e-133
    --//oracle 百进制转化为 0.10 * 100^(-67) . exp=-67, 尾数编码是 10 (十进制)+1 = 0xb .
    --//193+(-67) =  126  = 0x7e.
    --//或者将讲dump函数考虑不够仔细,在直接输入的情况下没有做边界检查.oracle number最小的正数字是1e-130.
    --//而且可以猜测2种格式的数据oracle是分开处理的.


  • 相关阅读:
    查看linux系统的版本
    单机运行环境搭建之 --CentOS-6.5安装配置Tengine
    nginx启动、重启、关闭
    JAVASE02-Unit010: 多线程基础 、 TCP通信
    俄罗斯方块小游戏
    JAVASE02-Unit09: 多线程基础
    JAVASE02-Unit08: 文本数据IO操作 、 异常处理
    JAVASE02-Unit07: 基本IO操作 、 文本数据IO操作
    JAVASE02-Unit06: 文件操作——File 、 文件操作—— RandomAccessFile
    JAVASE02-Unit05: 集合操作 —— 查找表
  • 原文地址:https://www.cnblogs.com/lfree/p/11623111.html
Copyright © 2011-2022 走看看