我有一个表,其中一列的数据类型为 number(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 位且小数点后不超过六位(小数点后),则总 PRECISION 为 20 + 6 = 26。然后您将声明NUMBER(26, 6).
您可以更改声明为的列NUMBER(20)(NUMBER如果满足您的需要),因为在此更改中不会丢失信息。但是请注意,已经保存在列中的数字有 ALREADY LOST 信息,无法从表中恢复;如果您需要修复它,您将需要转到这些数字的原始来源。
简要演示(注意在最后一个输出中,在更改之前插入的行的值永远更改为 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_FLOAT,BINARY_DOUBLE会更多
NUMBER [ (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 字段创建为没有 Scale 和 Precision 的 NUMBER 数据类型。这应该可以解决您的问题。