为什么PreparedStatement.setNull需要sqlType?

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

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

谢谢。

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

为了最大程度的兼 根据规范,有些数据库不允许将无类型的NULL发送到底层数据源。

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

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

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

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

  1. 神谕
  2. MySQL的
  3. SYBASE
  4. MS SQL Server
  5. HSQL

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

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

对于Oracle来说,将varchar2用于其他数据类型是非常不明智的。 这可能会欺骗优化器,您可能会得到一个糟糕的执行计划。 例如,使用绑定中的timestamp数据类型对日期列进行过滤,Oracle最终可能会读取将所有日期转换为时间戳的所有行,然后过滤掉所需的行。 如果你的日期列上有索引,它甚至可能会变得更糟(如果oracle选择使用它) – 对你的oracle块进行单次读取。

–Lasse