Oracle 在具有数字数据类型的列中保存十进制



>我有一个表,其中一列的数据类型为(20(。在一种情况下,我需要将十进制的值保存到列中,但列会自动将其转换为整数。下面是我为测试此方案而创建的简单测试表。

create table test_tbl
(
amt    number(20)
)
insert into test_tbl values (9.999)

上面插入的值为 10 而不是 9.999。如何完全按原样保存 9.999?

谢谢

在 Oracle 中,您可以(但不是必需的(为数据类型NUMBER列提供精度和小数位数。NUMBER(20)NUMBER(20,0)的有效简写,意思是20位数字,小数点后没有

。如何解决它取决于您的需求。通常,NUMBER列应简单地声明为NUMBER。仅当您有充分的理由时才指定精度和小数位数。

例如:如果数字必须限制为小数点前不超过 20 位,小数点后不得超过小数点后六位,则总精度为 20 + 6 = 26。然后,您将声明NUMBER(26, 6).

您可以将声明为NUMBER(20)的列更改为NUMBER(如果这满足您的需求(,因为此更改不会丢失信息。但是,请注意,已经保存在列中的数字已经丢失了信息,无法从表中恢复;如果您需要修复它,则需要转到这些数字的原始来源。

简短演示(请注意,在最后一个输出中,在更改之前插入的行的值永远更改为 10,无法恢复(:

create table test_tbl
(
amt    number(20)
);
insert into test_tbl values (9.999);
select * from test_tbl;
AMT
---
10
alter table test_tbl modify (amt number);
insert into test_tbl values (9.999);
select * from test_tbl;
AMT
-----
10
9.999

你可以尝试使用NUMBER(20,18),或者BINARY_FLOATBINARY_DOUBLE会更多

数字 [ (p [, s]( ] 具有精度p和小数位数s的数字。 p 的范围:从 1 到 38。 s的范围:从-84到127。 精度和小数位数均以十进制数字表示。

create table test_tbl
(
amt NUMBER(20,18)
);
insert into test_tbl values (9.99948489);

查询 1

SELECT * FROM test_tbl

结果

|        AMT |
|------------|
| 9.99948489 |

始终将 AMOUNT 和 NUMERIC 字段创建为 NUMBER 数据类型,而不使用小数位数和精度,除非您非常确定字段精度。这应该可以解决您的问题。

最新更新