【问题标题】:Does Oracle store trailing zeroes for Number data type?Oracle 是否为 Number 数据类型存储尾随零?
【发布时间】:2017-02-13 19:00:20
【问题描述】:

当我在表中存储数值并在 SQL Developer 中查询该表时,它不会显示数字数据类型的尾随零。

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 来存储值。

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

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

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

【问题讨论】:

  • 我使用SQL Developer工具查询数据进行测试。但是我们在实际场景中使用java oracle jdbc查询结果。
  • 我认为您不能告诉 Oracle 存储尾随零,但您应该能够配置您的 SQL 客户端(或您的应用程序)以使用所需的小数位数格式化输出。跨度>
  • 小数位数不是恒定的。用户可以设置任意位数的小数。但是有一个最大限制。
  • 如果那些微不足道的零对您的用户如此重要:请将这些数字另存为 VARCHAR2
  • @suren:您可以使用用户定义的小数位数来格式化前端的数字。

标签: sql oracle


【解决方案1】:

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

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

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

如果问题是比例不同,您可以在比较之前比例设置为适当的值。

【讨论】:

    【解决方案2】:

    如果您想保留数字输入的比例(可能很重要 - 10.1 的度量与 10.100 的度量不同)将 scale 存储在额外的列。

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

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

    在输出格式中使用这个值。

    不建议将数字存储为字符串 - 您保留比例但松散了数字验证,并可能将 CBO 与类型转换导致的错误估计混淆...

    【讨论】:

      【解决方案3】:

      10 和 10.00通常是相同的数字。 (如果您必须支付 10 美元或 10.00 美元甚至 10.0000 美元,这没有什么区别 :-)

      但是,如果您想以测量值的形式表示值的精度,因此 10.00 意味着您只知道小数点后两位的数字,但实数可以是 10.00001 或 10.009 或其他任何值,那么您必须另外添加存储此信息。一种方法是使用字符串数据类型,但您必须坚持某种格式('10.00' 或说 '10,00'),并且不应该将其用于数据库中的计算。

      另一种选择是存储数字和一个附加列用于小数位的精度,例如value = 10 / decimal_places = 2。比起存储字符串,我更喜欢这个。

      【讨论】:

        猜你喜欢
        • 2013-08-12
        • 2021-04-28
        • 2019-01-29
        • 1970-01-01
        • 1970-01-01
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 2018-02-20
        相关资源
        最近更新 更多