我们正在将应用程序的数据库从Oracle迁移到Postgres。在测试连接到新Postgres数据库和外部下游消费者应用程序的应用程序时,我们观察到一些奇怪的行为。高级应用程序流程如下:
1.我们的应用程序将一行写入其中一个表
1.我们的应用程序将表中的行读入Java对象
1.我们的应用程序将此对象解析为XML,然后在队列中发送该XML
1.第三方应用程序使用队列中的此消息并对其进行处理
在我们的Oracle数据库中,有一个名为AMOUNT
的列的表,该列定义为NUMBER(18,2)
。我们已经将Postgres数据库中的此列迁移到NUMERIC(18,2)
。
我们观察到的问题是,在迁移之后,第三方应用程序无法处理新消息,因为XML中的AMOUNT字段现在被格式化为3000.00
,而它们应该是3000
。他们不期望任何小数位。
我做了一些调查,发现这是因为在Oracle DB中,当我们编写3000.00
时,它实际上被存储为3000
,并以这种方式发送到下游应用程序。然而,当我们将3000.00
写入Postgres时,它实际上存储为3000.00
,然后由我们的应用程序检索。
我找不到任何文档说明Oracle在小数位为零时会截断小数位,但这是我观察到的行为。这是Oracle的预期行为吗?如果我们将3000.01
插入Oracle数据库,它就像这样存储。似乎只有当小数位为.00
时才截断小数位
1条答案
按热度按时间smdnsysy1#
这是一个表示问题,而不是数据存储问题。Oracle和PostgreSQL都按照列的定义存储满量程和精度;然而,当值被转换为没有指定格式的文本时,表示是特定于实现的。由于下游应用程序似乎期望整数值,因此在生成XML之前,要么将
AMOUNT
转换为bigint
,要么显式格式化它;例如AMOUNT::BIGINT
或TO_CHAR(AMOUNT 'FM999999999999999990')
。