【问题标题】:How to handle a 32 digits numeric in Java and PostgreSQL?如何在 Java 和 PostgreSQL 中处理 32 位数字?
【发布时间】:2015-05-19 07:30:52
【问题描述】:

我正在开发一个带有 JavaFX 和 PostgreSQL 数据库的小工具。我现在的任务是处理一个 32 位数字。我用 Long 试过了,但它太短/太小了。

我记得 Postgres 抱怨是因为我没有使用正确的数据类型,这就是为什么我先在这里询问,然后再更改受此问题影响的所有行。

我不会用这个数字进行数学运算,但我需要在其中保存 null。

你有什么建议?字符串,大整数?

代码示例:

//...
myObject.setSerialNumber(getLongFromDB(rs, "serialnumber"));
//...

private static Long getLongFromDB(ResultSet rs, String column) throws SQLException {
    Long l = rs.getLong(column);
    if (rs.wasNull()) l = null; // because getLong is long not Long, I need to know about null
    return l;
}

【问题讨论】:

  • 这真的是一个数字还是只包含数字的字符串?
  • 在数据库中它是一个“数字(32)”。
  • 你的方法setSerialNumber的参数是什么?是long吗?或者它是其他类型的,所以你要存储null
  • 它是 setObject(Long l)。

标签: java postgresql long-integer numeric


【解决方案1】:

在 Oracle/PostgreSQL 的情况下,NUMBER/NUMERIC 的对应类型是 Java 的 BigDecimal。这两种类型具有相同的内部表示(数字存储为十进制数字)。所以你不会遇到任何舍入错误的问题,而且它们之间的转换应该更快。

许多 Java 开发人员使用 Int(s)/Long(s) 作为 ID,这是一个很大的误解,因为他们被告知 int/long “更快”。在 JEE 中,您几乎从不使用从数据库返回的 NUMBER 执行任何数学计算。 BigDecimal 也比 Long 小一些。

【讨论】:

  • 我现在使用 BigInteger 来获取数字。当我写入数据库时​​,我使用 BigInteger 参数创建了一个新的 BigDecimal,因为 Postgres 无法映射 BigInteger。谢谢。
猜你喜欢
  • 2014-12-10
  • 2015-12-12
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
  • 2013-12-30
  • 2010-09-19
  • 1970-01-01
  • 2012-05-27
相关资源
最近更新 更多