代码之家  ›  专栏  ›  技术社区  ›  Matt

Oracle中数字的默认精度和比例是多少?

  •  58
  • Matt  · 技术社区  · 17 年前

    在Oracle中创建NUMBER类型的列时,可以选择不指定精度或比例。如果不指定这些默认值,它们会做什么?

    6 回复  |  直到 8 年前
        1
  •  45
  •   Angelo Marcotullio    17 年前

    数字(精度、刻度)

    如果未指定精度,该列将按给定值存储值。如果未指定比例,则比例为零。

    http://download.oracle.com/docs/cd/B28359_01/server.111/b28318/datatype.htm#CNCPT1832

        2
  •  27
  •   maxschlepzig    8 年前

    这个 NUMBER 类型可以在中指定 different styles :

                    Resulting  Resulting  Precision
    Specification   Precision  Scale      Check      Comment
    ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
    NUMBER          NULL       NULL       NO         'maximum range and precision',
                                                     values are stored 'as given'
    NUMBER(P, S)    P          S          YES        Error code: ORA-01438
    NUMBER(P)       P          0          YES        Error code: ORA-01438
    NUMBER(*, S)    38         S          NO
    

    其中,精度为总位数,刻度为总位数 小数点右边或左边的数字(负刻度)。

    Oracle将ORA-01438指定为

    值大于此列允许的指定精度

    是显式指定的。否则,Oracle将对插入或更新的

        3
  •  14
  •   baretta    17 年前

    我相信默认精度是38,默认刻度是零。 但是,此列实例的实际大小是动态的。它将占用存储值所需的空间,最多21个字节。

        4
  •  10
  •   Quassnoi    14 年前

    Oracle 1 byte 为了权力, 1字节 对于第一个有效位数字(即分隔符前的一个),其余数字表示其他数字。

    通过 digits 在这里 方法 centesimal digits (即。 base 100

    SQL> INSERT INTO t_numtest VALUES (LPAD('9', 125, '9'))
      2  /
    
    1 row inserted
    
    SQL> INSERT INTO t_numtest VALUES (LPAD('7', 125, '7'))
      2  /
    
    1 row inserted
    
    SQL> INSERT INTO t_numtest VALUES (LPAD('9', 126, '9'))
      2  /
    
    INSERT INTO t_numtest VALUES (LPAD('9', 126, '9'))
    
    ORA-01426: numeric overflow
    
    SQL> SELECT DUMP(num) FROM t_numtest;
    
    DUMP(NUM)
    --------------------------------------------------------------------------------
    Typ=2 Len=2: 255,11
    Typ=2 Len=21: 255,8,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,78,79
    

    正如我们所看到的,这里的最大数是 7.(7) * 10^124 ,他有 19 百位数表示精度,或 38

        5
  •  5
  •   spectra    13 年前

    事实上,你可以自己测试。

    CREATE TABLE CUSTOMERS ( CUSTOMER_ID NUMBER NOT NULL, JOIN_DATE DATE NOT NULL, CUSTOMER_STATUS VARCHAR2(8) NOT NULL, CUSTOMER_NAME VARCHAR2(20) NOT NULL, CREDITRATING VARCHAR2(10) ) ;

    从用户选项卡的列中,其中的表名为客户;

        6
  •  2
  •   bugybunny    7 年前

    我扩展了spectras的答案,这样人们就不必自己尝试了。

    这是在Oracle Database 11g Express Edition 11.2.0.2.0版-生产版上完成的。

    CREATE TABLE CUSTOMERS
    (
      CUSTOMER_ID NUMBER NOT NULL,
      FOO FLOAT NOT NULL,
      JOIN_DATE DATE NOT NULL,
      CUSTOMER_STATUS VARCHAR2(8) NOT NULL,
      CUSTOMER_NAME VARCHAR2(20) NOT NULL,
      CREDITRATING VARCHAR2(10)
    );
    
    select column_name, data_type, nullable, data_length, data_precision, data_scale
    from user_tab_columns where table_name ='CUSTOMERS'; 
    

    COLUMN_NAME      DATA_TYPE  NULLABLE DATA_LENGTH DATA_PRECISION DATA_SCALE
    CUSTOMER_ID      NUMBER     N        22        
    FOO              FLOAT      N        22          126    
    JOIN_DATE        DATE       N        7        
    CUSTOMER_STATUS  VARCHAR2   N        8        
    CUSTOMER_NAME    VARCHAR2   N        20        
    CREDITRATING     VARCHAR2   Y        10