当我将数据类型BigDecimal
的Java类中的值保存到数据类型为Number(23,5)
的列中的Oracle时,会截断小数点后的所有零。
例如,如果值为11.500
,则只有11.5
将存储在列中。
有没有办法阻止零被截断?
答案 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代码。
然而,它们是您希望存储数据的其他方法。
可以将两个数字分别存储为整数,并将它们连接起来。
即
create table my_table (
before_decimal integer
, after_decimal integer
);
如果您想进行任何数学运算,您还必须将两者连接在一起并转换为数字:
select to_number(before_decimal || '.' || after_decimal)
from my_table
作为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