为什么 PreparedStatement.setNull 需要 sqlType?

2022-09-03 01:54:20
  1. 根据ReadyStatement.setNull的java文档:“注意:您必须指定参数的SQL类型”。该方法需要列的 SQL 类型的原因是什么?

  2. 我注意到传递java.sql.Types.VARCHAR也适用于非varchar列。是否存在 VARCHAR 不适合的情况(某些列类型或某些数据库提供程序)?

谢谢。


答案 1

根据ReadyStatement.setNull的java文档:“注意:您必须指定参数的SQL类型”。该方法需要列的 SQL 类型的原因是什么?

为了获得最大的兼容性;根据规范,有些数据库不允许将非类型化的 NULL 发送到基础数据源。

我注意到传递java.sql.Types.VARCHAR也适用于非varchar列。是否存在 VARCHAR 不适合的情况(某些列类型或某些数据库提供程序)?

我不认为这种行为真的是规范的一部分,或者如果是,那么我确信那里有某种隐含的胁迫。在任何情况下,都不建议依赖这种在基础数据存储更改时可能会中断的行为。为什么不直接指定正确的类型呢?


答案 2

JDBC 驱动程序似乎正在远离 。请参阅添加对 setObject(<arg>, null) 的支持setNull

我支持更合乎逻辑的行为的数据库列表是:

  1. 神谕
  2. 我的SQL
  3. Sybase
  4. MS SQL Server
  5. 断续器

我不支持此逻辑行为的数据库列表是:

  1. 具有受保护的空参数的 Derby 查询失败
  2. PostgreSQL 无法在查询 ISNULL 建议的解决方案中的参数中传递 null

推荐