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

时间:2009-02-27 01:22:51

标签: database oracle number-formatting

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

6 个答案:

答案 0 :(得分:38)

NUMBER(精度,比例)

如果未指定precision,则列将值存储为给定值。如果未指定比例,则比例为零。

更多信息:

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

答案 1 :(得分:22)

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

                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

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

Oracle将ORA-01438指定为

  

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

如表中所示,此完整性检查仅在精度时才有效 明确指定。否则Oracle默默地舍入插入或更新 价值使用一些未指明的方法。

答案 2 :(得分:14)

我相信默认精度为38,默认比例为零。 但是,此列的实例的实际大小是动态的。它将需要尽可能多的空间来存储值,或最多21个字节。

答案 3 :(得分:9)

Oracle以下列方式存储数字:1 byte代表权力,1 byte表示第一个有效数字(即分隔符之前的数字),其余数字代表其他数字。< / p>

digits Oracle 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个百分数,或者{{1}}个十进制数字。

答案 4 :(得分:4)

实际上,您可以随时自行测试。

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) ) ;

select column_name, data_type, nullable, data_length, data_precision, data_scale from user_tab_columns where table_name ='CUSTOMERS';

答案 5 :(得分:1)

我扩展了光谱的答案,因此人们不必自己尝试。

这是在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    
相关问题