存储数字时,Oracle会截断小数点后的所有零
当我将数据类型为存储数字时,Oracle会截断小数点后的所有零,oracle,oracle12c,Oracle,Oracle12c,当我将数据类型为BigDecimal的Java类中的值持久化到数据类型为Number(23,5)的列中的Oracle时,它会截断小数点后的所有零 例如,如果值为11.500,则列中仅存储11.5 有没有办法阻止零被截断?如果您将数字存储为数字,这是不可能的 只有将数字存储为字符时才有可能,这不是最佳做法,而且似乎是矛盾的。如果要对其执行数学运算,可能会遇到严重问题 如果您的数字实际上是一个数字,那么数字的格式化就是向用户显示数据的代码的工作 在Oracle中,您可以使用以下格式: SQL>
BigDecimal
的Java类中的值持久化到数据类型为Number(23,5)
的列中的Oracle时,它会截断小数点后的所有零
例如,如果值为11.500
,则列中仅存储11.5
有没有办法阻止零被截断?如果您将数字存储为数字,这是不可能的 只有将数字存储为字符时才有可能,这不是最佳做法,而且似乎是矛盾的。如果要对其执行数学运算,可能会遇到严重问题 如果您的数字实际上是一个数字,那么数字的格式化就是向用户显示数据的代码的工作 在Oracle中,您可以使用以下格式:
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
如果对一个数字执行and运算,则这些运算都会考虑最大小数位数:
SQL> select 1 + 1.123 from dual;
1+1.123
----------
2.123
select to_number(before_decimal || '.' || after_decimal)
from my_table
我强烈建议将数字存储为数字。如果这不是一个数字,那么一定要将其存储为一个字符。电话号码是一些数据经常被错误地存储为号码的一个例子
但是,还有另外两个选项,它们意味着JavaBigDecimal
与数据库中的数据类型之间没有1-2-1映射。您需要一个进出数据库的转换层,或者您必须更改Java代码
但是,它们是存储数据的其他方法
SQL> select 1 + 1.123 from dual;
1+1.123
----------
2.123
select to_number(before_decimal || '.' || after_decimal)
from my_table
create table my_table (
my_number number
, no_places integer
);
然后,您需要在退出数据库时使用以下查询设置号码的格式:
select to_char(my_number, '99999999999999999999999.' || lpad('9', no_places, '9')
from my_table
如果你将你的号码存储为一个号码,这是不可能的 只有将数字存储为字符时才有可能,这不是最佳做法,而且似乎是矛盾的。如果要对其执行数学运算,可能会遇到严重问题 如果您的数字实际上是一个数字,那么数字的格式化就是向用户显示数据的代码的工作 在Oracle中,您可以使用以下格式:
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
如果对一个数字执行and运算,则这些运算都会考虑最大小数位数:
SQL> select 1 + 1.123 from dual;
1+1.123
----------
2.123
select to_number(before_decimal || '.' || after_decimal)
from my_table
我强烈建议将数字存储为数字。如果这不是一个数字,那么一定要将其存储为一个字符。电话号码是一些数据经常被错误地存储为号码的一个例子
但是,还有另外两个选项,它们意味着JavaBigDecimal
与数据库中的数据类型之间没有1-2-1映射。您需要一个进出数据库的转换层,或者您必须更改Java代码
但是,它们是存储数据的其他方法
SQL> select 1 + 1.123 from dual;
1+1.123
----------
2.123
select to_number(before_decimal || '.' || after_decimal)
from my_table
create table my_table (
my_number number
, no_places integer
);
然后,您需要在退出数据库时使用以下查询设置号码的格式:
select to_char(my_number, '99999999999999999999999.' || lpad('9', no_places, '9')
from my_table
此解决方案仅在您希望以格式化的方式显示数据时有效,但我的问题是按照我在java对象中提供的方式存储数据。当我使用数字(23,5)时,即使它是0,我也必须得到3个小数点。为什么存储的数据必须有3个小数点?除非这个数字实际上是一个字符,否则3个小数点是一个格式问题。客户要求我们需要获取数据,与java对象中输入的数据完全相同。然后您必须将其存储在一个字符中,正如我在顶部所述,希望您不必对其进行任何数学运算。是的,我误读了你的评论,然后又读了一遍,意识到你提出了一些不同的建议。然后,我编辑了我的答案,以包含您所说的内容。此解决方案仅在您希望以格式化方式显示数据时有效,但我的问题是以我在java对象中提供的方式存储数据。当我使用数字(23,5)时,我必须得到3个小数点,即使它是0。为什么存储的数据必须有3个小数点?除非这个数字实际上是一个字符,否则3个小数点是一个格式问题。客户要求我们需要获取数据,与java对象中输入的数据完全相同。然后您必须将其存储在一个字符中,正如我在顶部所述,希望您不必对其进行任何数学运算。是的,我误读了你的评论,然后又读了一遍,意识到你提出了一些不同的建议。然后我编辑了我的答案,把你说的内容包括进去。BigDecimal是否保留了尾随的零?我不认为这是重复的@MT0。问题不在于Oracle是否存储尾随零,而是如何避免它。这实际上是一个更有用的问题——OP非常清楚Oracle d