在Oracle中创建NUMBER类型的列时,可以选择不指定精度或小数位数。如果不指定默认值,这些默认值会做什么?
Answers:
NUMBER(精度,小数位数)
如果未指定精度,则该列将存储给定的值。如果未指定比例,则比例为零。
有关更多信息,请访问:
http://download.oracle.com/docs/cd/B28359_01/server.111/b28318/datatype.htm#CNCPT1832
number
:“未指定小数位数”,表示“小数位数为零”(仅允许整数),“未指定精度”,表示“按给定值”存储值(允许浮点数)。“按给定”实际上适用于number
,但并非缺乏重叠。幸运的是,他们澄清了12分。
NUMBER
在SSIS中引用没有精度或小数位数的列,则将其称为浮点数(DT_R8)。所以从我的角度来看,@ qualidafial是正确的
NUMBER
意思是NUMBER(38, 0)
,这是不正确的,并且与后面显示的示例相矛盾。
该NUMBER
类型可以指定不同的风格:
结果结果精度 规格精密秤检查备注 ―――――――――――――――――――――――――――――――――――――――――――――――――――― ―――――――――――――――――――――――――――――― NUMBER NULL NULL NO '最大范围和精度', 值按“给定”存储 NUMBER(P,S)PS是错误代码:ORA-01438 NUMBER(P)P 0是错误代码:ORA-01438 NUMBER(*,S)38 S否
精度是位数的总和,小数位数是小数点右边或左边的位数(负比例)。
Oracle将ORA-01438指定为
值大于此列允许的指定精度
如表中所示,仅在明确指定精度的情况下,此完整性检查才有效。否则,Oracle将使用某些未指定的方法静默舍入插入或更新的值。
*
意思?如果我定义并尝试插入(即45位数字)怎么办?将存储什么?为什么呢?什么是数学?NUMBER
a NUMBER(*,0)
123456789123456789123456789123456789123456789
*
仅表示Oracle使用其默认值,即38。这意味着NUMBER(*, 0)
等效于NUMBER(38, 0)
。如果您尝试在列中插入带有45个十进制数字的数字,NUMBER(38,0)
则会出现错误。
NUMBER(*,0)
,那么它会成功发出而不会发出任何警告,尽管会进行一些舍入。因此,这意味着NUMBER(38,0)
和NUMBER(*,0)
是不一样的。INT/INTEGER/SMALLINT
似乎表现得一样NUMBER(*,0)
。
我相信默认精度为38,默认比例为零。但是,此列实例的实际大小是动态的。存储该值将占用所需的空间,即最多21个字节。
create table ex(n number); insert into ex(n) values(1.5); select * from ex;
您回来了1.5
。有了scale=0
你就会回来1
。这也被记录在案,例如,使用11.2 Oracle文档,仅NUMBER
(不带精度和不带刻度)导致“最大范围和精度”。
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
十进制数字。
实际上,您始终可以自己进行测试。
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';
我扩展了光谱的答案,因此人们不必自己尝试。
这是在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