存储数字时,Oracle会在小数点后截断全零

时间:2017-11-22 13:04:59

标签: oracle oracle12c

当我将数据类型BigDecimal的Java类中的值保存到数据类型为Number(23,5)的列中的Oracle时,会截断小数点后的所有零。

例如,如果值为11.500,则只有11.5将存储在列中。

有没有办法阻止零被截断?

1 个答案:

答案 0 :(得分:2)

如果您将号码存储为号码,则无法进行此操作。

只有将您的号码存储为角色才有可能,这不是最佳做法,而且似乎是一个矛盾。如果你想对它进行数学运算,你可能会遇到严重的问题。

如果您的号码实际上是一个号码,那么号码的格式化是向用户显示数据的代码的作用。

在Oracle中,您可以使用TO_CHAR()进行格式化:

SQL> select to_char(11.5, '99.999') from dual;

TO_CHAR
-------
 11.500

对于其他语言来说,这显然会有所不同......

关于将数字存储为数字的观点是,您可以从任何地方获取格式并将其作为数字进行操作。例如,我们可以通过修改会话级设置来更改小数分隔符,而无需更改基础数据

SQL> alter session set nls_numeric_characters = ',.';

Session altered.

SQL> select 11000.5 from dual;

   11000.5
----------
   11000,5

如果对某个数字执行和操作,那么这些操作都会考虑最大小数位数:

SQL> select 1 + 1.123 from dual;

   1+1.123
----------
     2.123

我强烈建议将数字存储为数字。如果这不是数字,那么无论如何都要将它存储为一个字符。电话号码是某些数据的示例,这些数据经常被错误地存储为数字。

还有另外两个选项,但是,它们意味着您的Java BigDecimal与数据库中的数据类型之间没有1-2-1映射。您需要在数据库中输入的转换层,否则您必须更改Java代码。

然而,它们是您希望存储数据的其他方法。

  1. 可以将两个数字分别存储为整数,并将它们连接起来。

    create table my_table (
        before_decimal integer
      , after_decimal integer
        );
    

    如果您想进行任何数学运算,您还必须将两者连接在一起并转换为数字:

    select to_number(before_decimal || '.' || after_decimal) 
      from my_table
    
  2. 作为Alex has suggested,您还可以将小数位数存储为单独的列:

    create table my_table (
        my_number number
      , no_places integer
        );
    

    然后,您需要在退出数据库时使用此查询格式化数字:

    select to_char(my_number, '99999999999999999999999.' || lpad('9', no_places, '9')
      from my_table