【问题标题】:Does JDBC driver do automatic type casting for PostgresJDBC 驱动程序是否为 Postgres 进行自动类型转换
【发布时间】:2018-05-18 10:02:40
【问题描述】:

我的问题是基于我所做的观察,但无法找到答案。

在我的 java 代码中,我使用普通 statement.setDouble(number) 将“Double”类型的值插入到表中,并使用普通 resultSet.getDouble() 检索相同的值;

但是,在上述表格中,此特定列的类型为“文本”

值是如何被插入和检索的? Postgres / 驱动程序正在转换它吗?由于数据类型不匹配,它不应该抛出错误吗?

此外,如果 Postgres / 驱动程序正在自动转换它,它会如何影响性能? 使用 Postgres 9.4

所以这只是一种观察,更像是从试验中学习。我知道这绝对不是我会写的标准代码。

【问题讨论】:

  • 真正的问题是:到底为什么要将数字存储在text 列中?

标签: java postgresql jdbc


【解决方案1】:

是的,驱动程序正在进行转换。在PGResultSet 类中,您可以找到用于转换的代码(如果列是文本,则调用此代码,对于二进制列,还有其他转换)。

public static double toDouble(String s) throws SQLException {
    if (s != null) {
      try {
        s = s.trim();
        return Double.parseDouble(s);
      } catch (NumberFormatException e) {
        throw new PSQLException(GT.tr("Bad value for type {0} : {1}", new Object[]{"double", s}),
            PSQLState.NUMERIC_VALUE_OUT_OF_RANGE);
      }
    }
    return 0; // SQL NULL
}

规范声明应该进行此类转换,因此它按照规范工作。您是否应该依赖这些转换是另一回事,正如a_horse_with_no_name 评论的那样,为什么将双打存储为文本?

性能与此无关。与驱动程序真正在做的事情(即读取和写入数据)相比,进行转换是沧海一粟。

JDBC 规范规定的默认转换可以在末尾的附录B.6 中找到 http://download.oracle.com/otn-pub/jcp/jdbc-4_3-mrel3-eval-spec/jdbc4.3-fr-spec.pdf

【讨论】:

  • 谢谢,对此有点新意。我可以多了解一下您提到的这个规范吗?插入也是如此,对吗?
  • @Vpm 添加了 JDBC 4.1 规范的链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-04
  • 2016-08-09
  • 1970-01-01
相关资源
最近更新 更多