当前位置:  开发笔记 > 数据库 > 正文

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

如何解决《Oracle中数字的默认精度和比例是多少?》经验,为你挑选了4个好方法。

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



1> 小智..:

NUMBER(精度,比例)

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

更多信息:

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


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

2> maxschlepzig..:

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


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

3> baretta..:

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


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

4> Quassnoi..:

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

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有