在Oracle中,数字的默认精度和标度是多less?

在Oracle中创buildNUMBERtypes的列时,可以select不指定精度或小数位数。 如果您不指定它们,那么这些默认值是做什么的?

NUMBER(精度,比例)

如果未指定精度,那么该列存储给定的值。 如果没有指定比例,则比例为零。

更多信息在:

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

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

NUMBERtypes可以用不同的样式指定:

                由此产生的精度
规格精确度检查评论
 -------------------------------------------------- -----------------------------
 NUMBER NULL NULL NO '最大范围和精度' ,
                                                 值被存储为“给定”
 NUMBER(P,S)PS是错误代码:ORA-01438
 NUMBER(P)P 0是错误代码:ORA-01438
 NUMBER(*,S)38 S NO

精度是位数的总和,标度是小数点的左侧或右侧(负刻度)的位数。

Oracle指定ORA-01438为

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

如表中所述,只有在明确指定精度的情况下,此完整性检查才是有效的。 否则,Oracle将使用某种未指定的方法静静地将插入或更新的值四舍五入。

Oracle以下列方式存储数字: 1 byte的电源, 1 byte的第一个有效数字(在分隔符之前),其余为其他数字。

这里用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位十进制数字。

其实,你可以随时自己testing。

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

从user_tab_columns中selectcolumn_name,data_type,nullable,data_length,data_precision,data_scale,其中table_name ='CUSTOMERS';