在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位数字)怎么办?将存储什么?为什么呢?什么是数学?NUMBERa 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