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

Raj*_*eev 4 sql oracle types oracle11g sqldatatypes

在Oracle 文档中提到了这一点

NUMBER(精度,比例)

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

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

另一个问题中提到了这一点

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

所以NUMBER,NUMBER(*,0)应该是平等的,但事实并非如此.

我哪里错了?

Dav*_*ber 9

我认为文件中的句子

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

有点混乱.如果指定了精度且未指定比例,则比例为零.所以,例如,NUMBER(19)相当于NUMBER(19,0).NUMBER,它本身将具有38位精度,但没有定义的比例.因此,定义为a的列NUMBER可以接受任何比例的值,只要它们的精度为38位或更小(基本上,38个数字在任何地方都带有小数点).

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

表格如何影响数字数据存储此页面上可能会有所帮助.


Exh*_*ted 7

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

create table aaaaa
(
sno number(*,0),
sno1 number
);
Run Code Online (Sandbox Code Playgroud)

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

请找到以下工作方式

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

  • 为什么列“SNO1”的“select”语句的输出限制为“123123.213”?这是您的 SQL 客户端的限制吗?由于“NUMBER”没有设置小数位限制,因此结果应为“123123.21344”(小数点后五位)。 (2认同)