Oracle中数字的默认精度和比例是多少?

Mat*_*att 64 database oracle number-formatting

在Oracle中创建NUMBER类型的列时,您可以选择不指定精度或比例.如果您不指定它们,这些默认值会怎样?

小智 40

NUMBER(精度,比例)

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

更多信息:

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

  • 我知道这是直接从文档中得出的,但是IMO第二句话应该是:“ *如果指定了精度但小数位数不是*,则小数位数为零。” 否则,两者都适用于`number`:“未指定小数位数”,表示“小数位数为零”(仅允许整数),“未指定精度”,表示“按给定值”存储值(允许浮点数) 。“按给定”实际上是对“数字”正确的,但并非缺乏重叠。幸运的是,他们澄清了12分。 (3认同)
  • 文档中那句不真实的句子正是人们搜索此内容的原因。该句子指出“NUMBER”表示“NUMBER(38, 0)”,这是不正确的,并且与后面显示的示例相矛盾。 (3认同)
  • 浮点数与离散的数字类型有很大不同。所以,我认为它不会使用float (2认同)

max*_*zig 23

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

精度是总位数,刻度是小数点右或左(负刻度)的位数.

Oracle将ORA-01438指定为

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

如表中所示,此完整性检查仅在显式指定精度时才有效.否则,Oracle使用一些未指定的方法静默舍入插入或更新的值.

  • 我投票支持这个答案。如果您将列仅定义为 NUMBER,您将拥有最大精度和最大小数位数。如果将列定义为 NUMBER(5),则精度为 5,小数位数为 0。 (2认同)
  • @maxschlepzig:但是如果我在一个`NUMBER(*,0)`中插入一个45位数字,那么它会成功*而没有*任何警告,尽管有一些舍入.所以,这意味着`NUMBER(38,0)`和`NUMBER(*,0)`**不相同."INT/INTEGER/SMALLINT"似乎与`NUMBER(*,0)`的行为相同. (2认同)
  • @Nawaz,然后[Oracle数字语义](https://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#CNCPT313)甚至更复杂 - 用星号你得到38位数字精度('精度为38'),但似乎只有在明确指定了两个参数时才能进行完整性检查:'当您指定数字字段时,最好指定精度和比例.这为输入提供了额外的完整性检查. - Oracle没有具体说明它在38位之后的舍入方式 - 可能还取决于平台.我下周会更新表格. (2认同)

bar*_*tta 14

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

  • 这个答案是不正确的.您可以轻松地给出一个反例:`create table ex(n number); 插入ex(n)值(1.5); select*from ex;`你回来了`1.5`.使用`scale = 0`,你会得到'1`.这也记录在案,例如11.2 Oracle文档中只有"NUMBER"(没有精度且没有缩放)会导致"最大范围和精度". (8认同)

Qua*_*noi 9

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
Run Code Online (Sandbox Code Playgroud)

我们可以看到,这里的最大数是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';

  • 不幸的是,这并没有显示 NUMBER 的默认精度和小数位数,它只是返回 NULL CUSTOMER_ID DATA_TYPE:NUMBER NULLABLE:N DATA_LENGTH:22 DATA_PRECISION:(null) DATA_SCALE:(null) (2认同)
  • 但是,如果您通过插入非常大的数字进行测试,则会显示所有内容:CREATE TABLE TEST_NUMBER (N1 NUMBER); INSERT INTO TEST_NUMBER (N1) VALUES (98765432109876543210987654321098765432109876543210.01234567890123456789); 从 TEST_NUMBER 中选择 N1;收益率:98765432109876543210987654321098765432110000000000 (2认同)