Oracle中的“NUMBER”和“NUMBER(*,0)”是否相同?

时间:2015-01-29 05:41:18

标签: sql oracle types oracle11g sqldatatypes

在Oracle documentation中提到了

  

NUMBER(精度,比例)

     

如果未指定precision,则列将值存储为给定值。如果   没有指定比例,比例为零。

但是NUMBER(没有精度和比例)也接受浮点数(34.30)但是根据文档,如果没有指定scale,默认情况下它应该是零刻度,所以它应该只允许整数,我错了?。

another questions中提到了

  

默认精度为38,默认比例为零

所以NUMBERNUMBER(*,0)应该相等但不是。

我哪里错了?

3 个答案:

答案 0 :(得分:7)

scale的默认值不为零,它没有任何值。因此,它可以接受-84 to 127之间的任何值。如果将其限制为零,则即使该值包含比例值

,也不会接受任何预设
create table aaaaa
(
sno number(*,0),
sno1 number
);

user_tab_columns将为您提供精度和比例的值

SQL> select column_name,data_precision,data_scale from user_tab_columns where ta
ble_name = 'AAAAA';

COLUMN_NAME                    DATA_PRECISION DATA_SCALE
------------------------------ -------------- ----------
SNO                                                    0
SNO1

SQL>

请查看以下工作

SQL> select * from aaaaa;

no rows selected

SQL> insert into aaaaa values (123.123123,123123.21344);

1 row created.

SQL> commit;

Commit complete.

SQL> select * from aaaaa;

       SNO       SNO1
---------- ----------
       123 123123.213

SQL>

答案 1 :(得分:6)

我认为文档中的句子

  

如果未指定precision,则列将值存储为给定值。如果未指定比例,则比例为零。

有点令人困惑。如果指定了精度并且未指定比例,则比例为零 。因此,例如,NUMBER(19)相当于NUMBER(19,0)NUMBER本身将包含38位 precision ,但没有定义 scale 。因此,定义为NUMBER的列可以接受任何比例的值,只要它们的精度为38位或更低(基本上,38个数字在任何地方都带有小数点)。

你也可以指定一个没有精度的比例:NUMBER(*, <scale>),但这只是创建了38位精度的列,所以我不确定它是否特别有用。

this page上的表格如何影响数字数据存储的比例因素可能会有所帮助。

答案 2 :(得分:0)

Oracle documentation的这一部分非常清楚:

  

使用以下格式指定整数:

     

NUMBER(p)

     

这表示精度为p,小数位数为0的定点数,它等于NUMBER(p,0)。

  

使用以下格式指定浮点数:

     

NUMBER

     

缺少精度和小数位数指示符将指定Oracle数字的最大范围和精度。

star 精度的含义已记录在here中,表示精度为38