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