zoukankan      html  css  js  c++  java
  • 简析oracle中number类型的存储

    问题:每次在定义column或者 variable的时候,如果严格定义的number类型的precision,隔或长或
    短的一段时间总会发现 把Numberic error的错误。那么
    ①怎么避免这种情况的发生?
    ②不指定precision可不可以?
    ③可以的话,那可行不可行,会不会占用空间,导致存储上的浪费?
    ④至少varchar2类型 是必须指定precision的。

    对于②提出的方法进行简单测试:

    SQL> create table test_default (
      2  code number
      3  )
      4  /

    表已创建。

    SQL> insert into test_default
      2  values(123.89);

    已创建 1 行。

    SQL> insert into test_default
      2  values(0);

    已创建 1 行。

    SQL> insert into test_default
      2  values(1);

    已创建 1 行。

    SQL> insert into test_default
      2  values(2);

    已创建 1 行。

    SQL> insert into test_default
      2  values(25);

    已创建 1 行。

    SQL> insert into test_default
      2  values(4100)
      3  /

    已创建 1 行。

    SQL> insert into test_default
      2  values(132004078);

    已创建 1 行。

    SQL> insert into test_default
      2  values(2.01);

    已创建 1 行。

    SQL> insert into test_default
      2  values(0.3)
      3  /

    已创建 1 行。

    SQL> insert into test_default
      2  values(0.00000125)
      3  /

    已创建 1 行。

    SQL> insert into test_default
      2  values(115.200003)
      3  /

    已创建 1 行。

    SQL> insert into test_default
      2  values(-1);

    已创建 1 行。

    SQL> insert into test_default
      2  values(-5)
      3  /

    已创建 1 行。

    SQL> insert into test_default
      2  values(-20032)
      3  /

    已创建 1 行。

    SQL> insert into test_default
      2  values(-234.432)
      3  /

    已创建 1 行。

    SQL> commit;

    提交完成。
     insert into test_default
    values(10000)
    /
    insert into test_default
    values(100000)
    /
    insert into test_default
    values(1000000)
    /
    insert into test_default
    values(-123456.78901)
    /
    insert into test_default
    values(-123456.789)


    /
    insert into test_default
    values(100000000000000000000000000000000000)

    SQL> col code format 999999999

    SQL> select code,dump(code) from test_default
      2  /

           CODE DUMP(CODE)
    ---------- --------------------------------------------------------------------------------
             1 Typ=2 Len=2: 193,2
            25 Typ=2 Len=2: 193,26
          2.01 Typ=2 Len=3: 193,3,2
        100000 Typ=2 Len=2: 195,11
       1000000 Typ=2 Len=2: 196,2
        123.89 Typ=2 Len=4: 194,2,24,90
     132004078 Typ=2 Len=6: 197,2,33,1,41,79
       1.25E-6 Typ=2 Len=3: 190,2,26
         10000 Typ=2 Len=2: 195,2
             2 Typ=2 Len=2: 193,3
      -234.432 Typ=2 Len=6: 61,99,67,58,81,102
          4100 Typ=2 Len=2: 194,42
           0.3 Typ=2 Len=2: 192,31
    -123456.78 Typ=2 Len=7: 60,89,67,45,23,11,102
          1E35 Typ=2 Len=2: 210,11
    -123456.78 Typ=2 Len=8: 60,89,67,45,23,11,91,102
    115.200003 Typ=2 Len=6: 194,2,16,21,1,4
            -1 Typ=2 Len=3: 62,100,102
        -20032 Typ=2 Len=5: 60,99,101,69,102
            -5 Typ=2 Len=3: 62,96,102
     
          CODE DUMP(CODE)
    ---------- --------------------------------------------------------------------------------
             0 Typ=2 Len=1: 128

    SQL> select code,dump(code,16) from test_default;
     
          CODE DUMP(CODE,16)
    ---------- --------------------------------------------------------------------------------
             1 Typ=2 Len=2: c1,2
            25 Typ=2 Len=2: c1,1a
          2.01 Typ=2 Len=3: c1,3,2
        100000 Typ=2 Len=2: c3,b
       1000000 Typ=2 Len=2: c4,2
        123.89 Typ=2 Len=4: c2,2,18,5a
     132004078 Typ=2 Len=6: c5,2,21,1,29,4f
       1.25E-6 Typ=2 Len=3: be,2,1a
         10000 Typ=2 Len=2: c3,2
             2 Typ=2 Len=2: c1,3
      -234.432 Typ=2 Len=6: 3d,63,43,3a,51,66
          4100 Typ=2 Len=2: c2,2a
           0.3 Typ=2 Len=2: c0,1f
    -123456.78 Typ=2 Len=7: 3c,59,43,2d,17,b,66
          1E35 Typ=2 Len=2: d2,b
    -123456.78 Typ=2 Len=8: 3c,59,43,2d,17,b,5b,66
    115.200003 Typ=2 Len=6: c2,2,10,15,1,4
            -1 Typ=2 Len=3: 3e,64,66
        -20032 Typ=2 Len=5: 3c,63,65,45,66
            -5 Typ=2 Len=3: 3e,60,66
     
          CODE DUMP(CODE,16)
    ---------- --------------------------------------------------------------------------------
             0 Typ=2 Len=1: 80

    ③结论:

      首先必要的说明关于dump函数的返回格式类似:

      类型 <[长度]>,符号/指数位 [数字1,数字2,数字3,......,数字20]
    typ=2标识的是number类型
    len是占用字节数
    后面是每个字节上存储的东西,每个字节上是符号位、小数点位还是咋存的,然后得出来值,这个有点费脑细胞@@ 先放那。具体可以看看这个
     
    ---------------------------
    从输出的结果可以看到:
    可以这样定义,没有问题;
    不会有空间占用的问题,每个数占用的空间和它本身的复杂度有关,并非数值越大占用的字节数就越多,是按需占用的,这点和varchar2类似。
     
     
  • 相关阅读:
    哈工大《机器学习》最小二乘法曲线拟合——实验一
    最小二乘法曲线拟合以及matlab实现
    Dubbo简介
    Redis持久化策略
    Linux安装Redis
    RabbitMQ-Demo
    RabbitMQ安装相关
    SpringCloud-Alibaba-Nacos-Demo
    Nacos_启动失败原因
    IDEA中properties中文显示乱码
  • 原文地址:https://www.cnblogs.com/gracejiang/p/5890450.html
Copyright © 2011-2022 走看看