为什么PreparedStatement.setNull需要sqlType?

Mos*_*sha 16 java sql jdbc

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

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

谢谢.

San*_*rma 11

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

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

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

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


use*_*343 8

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

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

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

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

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