在Oracle中,数字的默认精度和标度是多少?

11 浏览
0 Comments

在Oracle中,数字的默认精度和标度是多少?

在Oracle中创建一个NUMBER类型的列时,你可以选择不指定精度或刻度。如果不指定它们,这些默认值会起到什么作用?

0
0 Comments

在Oracle中,数字的默认精度是38,默认刻度为零。实际上,这个列的实例大小是动态的。它将占用尽可能多的空间来存储值,最大为21个字节。

然而,上述回答是不正确的。我们可以举一个反例:create table ex(n number); insert into ex(n) values(1.5); select * from ex;你将得到1.5。如果scale=0,你将得到1。这也是有文档记录的,例如在Oracle 11.2中,NUMBER(没有精度和刻度)的结果是“最大范围和精度”。

鉴于这个问题,我们应该意识到默认精度和刻度可能会导致不准确的结果。如果我们希望确保精确的数值计算,我们应该显式地指定精度和刻度。

为了解决这个问题,我们可以在创建表时显式地指定数字列的精度和刻度。例如:create table ex(n number(10,2));这将创建一个精度为10,刻度为2的数字列。

另外,我们也可以通过修改现有的表来更改数字列的精度和刻度。例如:alter table ex modify (n number(8));这将将数字列的精度更改为8,而保持刻度为2不变。

总结起来,为了避免默认精度和刻度可能带来的问题,我们应该显式地指定数字列的精度和刻度,以确保数值计算的准确性。如果需要更改现有列的精度和刻度,可以使用alter table语句进行修改。

0
0 Comments

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

在Oracle中,数字类型(NUMBER)可以以不同的方式进行指定,具体如下:

NUMBER:没有指定精度和标度,拥有最大范围和精度,默认情况下会根据给定的值进行存储。

NUMBER(P, S):指定了精度和标度,如果超出指定的范围,会出现错误码 ORA-01438。

NUMBER(P):只指定了精度,标度为0,如果超出指定的范围,会出现错误码 ORA-01438。

NUMBER(*, S):指定了标度,精度为38,不进行完整性检查。

其中,精度表示数字的总位数,标度表示小数点右侧或左侧(负标度)的位数。

Oracle在表中指定了错误码ORA-01438为“值大于此列允许的指定精度”,如表中所示,只有在显式指定了精度时才会进行完整性检查,否则Oracle会使用一种未指定的方法对插入或更新的值进行四舍五入。

如果将列定义为NUMBER,则精度和标度都是最大的。如果将列定义为NUMBER(5),则精度是5,标度为0。

在NUMBER中,*表示Oracle使用其默认值,即38。这意味着NUMBER(*, 0)等同于NUMBER(38, 0)。如果尝试将一个有45位小数位的数字插入到NUMBER(38, 0)列中,会收到错误提示。

但是,如果将一个有45位小数位的数字插入到NUMBER(*, 0)中,它会成功插入,但会进行一些四舍五入。这意味着NUMBER(38, 0)和NUMBER(*, 0)不相同。INT/INTEGER/SMALLINT似乎与NUMBER(*, 0)行为相同。

如果使用*作为NUMBER的精度,Oracle的数字语义更加复杂。使用*可以获得38位的精度('the precision is 38'),但是只有在显式指定了两个参数时才进行完整性检查。Oracle没有明确指定在38位之后如何进行四舍五入,可能也与平台有关。

感谢更新,现在对我来说看起来合理。如果我有什么要分享的,我会再次在这里评论。:-)

0
0 Comments

Oracle中的NUMBER数据类型可以用来存储数字,它可以指定精度和标度。如果没有指定精度,列将按照给定的值进行存储。如果没有指定标度,则标度为零。

然而,关于NUMBER数据类型默认精度和标度的说明在Oracle文档中存在一些问题。文档中的一句话说:“如果指定了精度但未指定标度,标度为零。”这句话的意思是,如果只指定了精度,标度自动为零。但实际上,这句话对于没有指定精度的情况也适用,即值将按照给定的方式存储,可以包括浮点数。

这个问题导致了人们对于NUMBER数据类型默认精度和标度的困惑,因此他们开始搜索相关信息。他们希望找到一个明确的解释,以便了解NUMBER数据类型的默认行为。

解决这个问题的方法是查看Oracle文档的其他部分,或者在其他来源中寻找相关信息。在某些情况下,人们可能会发现在特定的环境或工具中,NUMBER数据类型可能会被解释为其他类型,比如float。这是因为不同的环境或工具对于数据类型的解释可能存在差异。

总结起来,Oracle中NUMBER数据类型的默认精度和标度取决于是否指定了精度和标度。如果没有指定精度,列将按照给定的值进行存储。如果没有指定标度,标度将为零。需要注意的是,不同的环境或工具可能对NUMBER数据类型的解释存在差异。

0