在Oracle中,数字的默认精度和标度是多less?
在Oracle中创buildNUMBERtypes的列时,可以select不指定精度或小数位数。 如果您不指定它们,那么这些默认值是做什么的?
NUMBER(精度,比例)
如果未指定精度,那么该列存储给定的值。 如果没有指定比例,则比例为零。
更多信息在:
http://download.oracle.com/docs/cd/B28359_01/server.111/b28318/datatype.htm#CNCPT1832
我相信默认的精度是38,默认的比例是零。 但是,此列的实例的实际大小是dynamic的。 这将需要尽可能多的空间来存储的价值,或最多21个字节。
NUMBER
types可以用不同的样式指定:
由此产生的精度 规格精确度检查评论 -------------------------------------------------- ----------------------------- 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';