Oracle是否为Number数据类型存储尾随零?

问题描述:

当我将数值存储在表中并在SQL Developer中查询该表时,它不会显示Number数据类型的尾随零。Oracle是否为Number数据类型存储尾随零?

create table decimal_test(decimal_field number(*,10)); 

insert into decimal_test(decimal_field) values(10); 
insert into decimal_test(decimal_field) values(10.11); 
insert into decimal_test(decimal_field) values(10.100); 
insert into decimal_test(decimal_field) values(10.00); 

select * from decimal_test; 

,结果是

10 
10.11 
10.1 
10 

这些值从Java代码处理。在这种情况下,我正在使用BigDecimal来存储该值。

在保存到DB之前,如果我有BigDecimal(10.00),保存之后,从DB返回的值为BigDecimal(10)。等于BigDecimal中的方法失败,因为比例已更改。

而我的小数精度不是恒定的。用户可以设置BigDecimal(10.00)或BigDecimal (10.000)等。因此,值需要按照原样存储在DB中。

有什么办法在oracle中存储尾随零?

+0

我使用SQL Developer工具来查询数据进行测试。但是我们使用java oracle jdbc在实际场景中查询结果。 – suren

+0

我不认为您可以告诉Oracle存储尾随零,但您应该能够配置您的SQL客户端(或您的应用程序)以便将输出格式化为期望的小数位数。 –

+0

小数位数不是常数。用户可以设置任意数量的小数位数。但是有一个最大限制。 – suren

尾随零的存在是显示问题,而不是存储问题。尾随零不重要,并且无论如何,只要正确,数字的内部格式就不重要。 1010.00000之间没有数值差异。

如果您需要尾随零,您可以在转换显示值时始终使用格式。例如:

System.out.printf("%10.4d\n", decimalValue); 

如果问题是在规模上的差异,你可以设置规模,以适当的值进行比较之前。

如果你想保留数字输入的规模(这可以显著 - 从量度10.100的10.1措施是不同的)的规模存储在一个额外的列。

create table decimal_test 
(decimal_field number(*,10), 
decimal_scale number(*,0) 
); 

计算输入的比例并将其存储在新列decimal_scale中。

在输出格式中使用此值。

我最好不建议号码存储为一个字符串 - 你保持规模,但宽松的数量验证和潜在地错误估计造成的类型转换混淆CBO ...

10 10.00是一般是相同的数字。 (如果您必须支付10美元或10.00美元甚至10.0000美元,则不会产生影响:-)

但是,如果您要表示测量值的精度,那么10.00表示您只知道最多两位小数的数字,但实际的数字可以是10.00001或10.009或其他,然后您必须添加这些信息。一种方法是使用字符串数据类型,但是你必须坚持某种格式('10。00“或者说'10,00'),并且不应该在数据库中使用它进行计算。

另一种选择是存储数字和附加的小数位数的精度,例如,值= 10/decimal_places = 2。我宁愿这通过存储一个字符串。