getObject(index, Long) 为 null 返回 0

Sun*_*day 1 java mysql jdbc

mysql jdbc:

resultSet.getInt(index)
Run Code Online (Sandbox Code Playgroud)

为 NULL 返回 0,因为它的返回类型是 int,而不是 java.lang.Integer。但

resultSet.getObject(index, java.lang.Long) 
Run Code Online (Sandbox Code Playgroud)

为空返回 0。它应该返回NULL。对?检查结果集的列类型,列类型为java.lang.Long。它应该返回空值,但为空值返回 0。

更新

检查 Oracle 11g:它按预期返回 null。

Mar*_*eel 5

来自 JDBC 4.3 规范:

当在数据库中的列的值是SQL NULL,它可以返回到Java应用程序为null0,或false,根据列值的类型。映射到 JavaObject类型的列值 作为 Java 返回null;那些映射到数字类型的返回为0;那些映射到 Javaboolean 的将作为false. 因此,可能需要调用该 wasNull方法来确定检索到的最后一个值是否为 SQL NULL

不幸的是,措辞含糊不清,可以解释为如果它是数字类型,则getObject可能会返回,但这不是本意。0NULL

JDBC 1.20 规范对此更加清晰:

当您使用 ResultSet.getXXX 方法之一读取 SQL “NULL”时,您将收到:

  • 返回 Java 对象的那些 getXXX 方法的 Java“空”值。
  • getByte、getShort、getInt、getLong、getFloat 和 getDouble 的零值
  • getBoolean 的假值。

换句话说,getObject应该返回null带有NULL值的整数列。

这是通过的文件进一步支持getObject(int/String)(这也适用于getObject(int/String, Class)

如果值为 SQL NULL,则驱动程序返回 Java null