79

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

4

6 回答 6

46

NUMBER(精度、比例)

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

更多信息请访问:

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

于 2009-02-27T02:18:42.427 回答
29

NUMBER可以用不同的样式指定类型:

                结果 结果精度
规格 精度 刻度 检查 备注
―――――――――――――――――――――――――――――――――――――――――――――――― ――――――――――――――――――――――――――――――
NUMBER NULL NULL NO          '最大范围精度' ,
                                                 值“按给定”存储
NUMBER(P, S) PS YES 错误代码:ORA-01438
NUMBER(P) P 0 是 错误代码:ORA-01438
号码(*, S) 38 S 否

其中精度是总位数,比例是小数点右侧或左侧(负比例)的位数。

Oracle 将 ORA-01438 指定为

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

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

于 2015-04-23T21:49:26.450 回答
14

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

于 2009-02-27T01:37:02.463 回答
10

Oracle以以下方式存储数字:1 byte对于幂,1 byte对于第一个有效数字(即分隔符之前的一个),其余的用于其他数字。

这里digitsOracle意思是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小数位。

于 2009-03-02T17:34:53.400 回答
5

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

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

于 2012-12-07T09:01:20.617 回答
2

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

这是在 Oracle Database 11g Express Edition Release 11.2.0.2.0 - Production 上完成的。

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    
于 2018-12-18T09:50:04.093 回答