Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java getObject(索引,Long)返回0表示null_Java_Mysql_Jdbc - Fatal编程技术网

Java getObject(索引,Long)返回0表示null

Java getObject(索引,Long)返回0表示null,java,mysql,jdbc,Java,Mysql,Jdbc,MySql jdbc: resultSet.getInt(index) 为NULL返回0,因为其返回类型为int,而不是java.lang.Integer。但是 resultSet.getObject(index, java.lang.Long) 返回0表示null。它应该返回NULL。正当检查的列类型 结果集的列类型为java.lang.Long。它应该返回null,但为null返回0 使现代化 选中Oracle 11g:它按预期返回null。来自JDBC 4.3规范: 当数据库中的列值

MySql jdbc:

resultSet.getInt(index)
为NULL返回0,因为其返回类型为int,而不是java.lang.Integer。但是

resultSet.getObject(index, java.lang.Long) 
返回0表示null。它应该返回NULL。正当检查的列类型 结果集的列类型为java.lang.Long。它应该返回null,但为null返回0

使现代化
选中Oracle 11g:它按预期返回null。

来自JDBC 4.3规范:

当数据库中的列值为SQL
NULL
时,可能是 作为
null
0
false
返回到Java应用程序,具体取决于 关于列值的类型。映射到Java的列值
对象
类型作为Java
null
返回;那些映射到 数值类型返回为
0
;映射到Java
boolean
返回为
false
。因此,可能需要调用
wasNull
方法,以确定检索到的最后一个值是否为 SQL
NULL

不幸的是,措辞含糊不清,这可能意味着
getObject
可能返回
0
for
NULL
,如果它是数字类型,但这不是目的

JDBC 1.20规范在这方面更加明确:

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

  • 返回Java对象的那些getXXX方法的Java“null”值
  • getByte、getShort、getInt、getLong、getFloat和getDouble的零值
  • getBoolean的错误值
换句话说,对于值为
null
的整数列,
getObject
应该返回
null

getObject(int/String)
的文档进一步支持了这一点(该文档也适用于
getObject(int/String,Class)

如果值是SQL
NULL
,则驱动程序返回一个Java
NULL


根据JDBC 4.3规范:

当数据库中的列值为SQL
NULL
时,可能是 作为
null
0
false
返回到Java应用程序,具体取决于 列值的类型。映射到Java的列值
对象
类型作为Java
null
返回;映射到 数值类型返回为
0
;那些映射到Java
布尔值的类型
返回为
false
。因此,可能需要调用
wasNull
方法,以确定检索到的最后一个值是否为 SQL
NULL

不幸的是,措辞含糊不清,这可能意味着
getObject
可能返回
0
for
NULL
,如果它是数字类型,但这不是目的

JDBC 1.20规范在这方面更加明确:

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

  • 返回Java对象的那些getXXX方法的Java“null”值
  • getByte、getShort、getInt、getLong、getFloat和getDouble的零值
  • getBoolean的错误值
换句话说,对于值为
null
的整数列,
getObject
应该返回
null

getObject(int/String)
的文档进一步支持了这一点(该文档也适用于
getObject(int/String,Class)

如果值是SQL
NULL
,则驱动程序返回一个Java
NULL


您的问题是“应该吗?”,还是您的问题是“它认为应该,但事实并非如此。发生了什么事?”)对于getObject(…),它应该返回null,但返回0。如果您使用的是最新的MySQL连接器/J,而这种情况仍然存在,那么我建议您使用MySQL.Workaroundfor Optional:Optional.ofNullable(rs.getString(“index”).map提交一个bug(Long::valueOf);您的问题是“应该吗?”,还是您的问题是“它认为应该,但事实并非如此。发生了什么事?”)对于getObject(…),它应该返回null,但返回0。如果您使用的是最新的MySQL连接器/J,并且这种情况仍然存在,那么我建议您使用MySQL提交一个bug。变通方法For Optional:Optional.ofNullable(rs.getString(“index”)).map(Long::valueOf);那么这是Mysql JDBC的一个bug?getObject(..)的Mysql实现似乎只是将它委托给getXXX()用于特定类型。@Sunnyday是的,这是一个bug。如果java类型是基元类型“char”,SQL null值转换成什么?@Sunnyday JDBC中不支持原语类型char。SQL
char(1)
只是一个字符串。所以它是Mysql JDBC的一个bug?getObject(..)的Mysql实现似乎只是将特定类型的char委托给getXXX()。@Sunnyday是的,这是一个bug。如果java类型是原语类型“char”,SQL null值转换成什么?@Sunnyday JDBC中不支持原语类型char。SQL
char(1)
只是一个字符串。