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中存储尾随零?
尾随零的存在是显示问题,而不是存储问题。尾随零不重要,并且无论如何,只要值正确,数字的内部格式就不重要。 10
和10.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。我宁愿这通过存储一个字符串。
我使用SQL Developer工具来查询数据进行测试。但是我们使用java oracle jdbc在实际场景中查询结果。 – suren
我不认为您可以告诉Oracle存储尾随零,但您应该能够配置您的SQL客户端(或您的应用程序)以便将输出格式化为期望的小数位数。 –
小数位数不是常数。用户可以设置任意数量的小数位数。但是有一个最大限制。 – suren