Oracle中数字的默认精度和小数位数是什么?


73

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

Answers:


44

NUMBER(精度,小数位数)

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

有关更多信息,请访问:

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


2
浮点数与离散的数字类型有很大不同。因此,我认为它不会使用float
paolov

6
我知道这是直接从文档中得出的,但是IMO第二句话应该是:如果指定了精度,但未指定scale,则scale为零。” 否则,两者都适用于number:“未指定小数位数”,表示“小数位数为零”(仅允许整数),“未指定精度”,表示“按给定值”存储值(允许浮点数)。“按给定”实际上适用于number,但并非缺乏重叠。幸运的是,他们澄清了12分。
埃里克·埃斯基尔森

1
我知道的问题不是关于SSIS的,而是通过搜索将我带到了这里。如果NUMBER在SSIS中引用没有精度或小数位数的列,则将其称为浮点数(DT_R8)。所以从我的角度来看,@ qualidafial是正确的
Nick.McDermaid

2
文档中的那句不真实的句子正是人们搜寻此内容的原因。该句子指出的NUMBER意思是NUMBER(38, 0),这是不正确的,并且与后面显示的示例相矛盾。
ddekany

25

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将使用某些未指定的方法静默舍入插入或更新的值。


我投票给这个答案。如果将列仅定义为NUMBER,则将具有最大的精度和最大的比例。如果将列定义为NUMBER(5),则精度为5,小数
位数

精确度是什么*意思?如果我定义并尝试插入(即45位数字)怎么办?将存储什么?为什么呢?什么是数学?NUMBERa NUMBER(*,0)123456789123456789123456789123456789123456789
纳瓦兹

@Nawaz,*仅表示Oracle使用其默认值,即38。这意味着NUMBER(*, 0)等效于NUMBER(38, 0)。如果您尝试在列中插入带有45个十进制数字的数字,NUMBER(38,0)则会出现错误。
maxschlepzig

2
@maxschlepzig:但是,如果我插入一个45位数字int a NUMBER(*,0),那么它会成功发出不会发出任何警告,尽管会进行一些舍入。因此,这意味着NUMBER(38,0)NUMBER(*,0)一样的。INT/INTEGER/SMALLINT似乎表现得一样NUMBER(*,0)
纳瓦兹

2
@Nawaz,那么Oracle Number语义会更加复杂-使用星号,您可以获得38位精度(“精度为38”),但是似乎只有在明确指定了两个参数的情况下,您才能进行完整性检查:数字字段,最好指定精度和小数位数。这样可以对输入进行额外的完整性检查。” -Oracle没有指定如何将38位四舍五入-可能还取决于平台。下周我将更新表。
maxschlepzig

15

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


8
这个答案是不正确的。您可以轻松地举一个反例:create table ex(n number); insert into ex(n) values(1.5); select * from ex;您回来了1.5。有了scale=0你就会回来1。这也被记录在案,例如,使用11.2 Oracle文档,仅NUMBER(不带精度和不带刻度)导致“最大范围和精度”。
maxschlepzig 2015年

10

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十进制数字。


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


1
不幸的是,这没有显示默认的精度和小数位数,它只是返回NULL CUSTOMER_ID DATA_TYPE:NUMBER NULLABLE:N DATA_LENGTH:22 DATA_PRECISION:(null)DATA_SCALE:(null)
Ed Randall

2
但是,如果您通过插入非常大的数字进行测试,则将全部显示出来:CREATE TABLE TEST_NUMBER(N1 NUMBER); 插入到TEST_NUMBER(N1)个值中(98765432109876543210987654321098765432109876543210.01234563456012012789); 从TEST_NUMBER中选择N1;收益:98765432109876543210987654321098765432110000000000
Ed Randall

2

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

这是在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    
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.