Question: 1. According to the java docs of PreparedStatement.setNull: "Note: You must specify the parameter's SQL type". What is the reason that the method requires the SQL type of the column?
2. I noticed that passing java.sql.Types.VARCHAR also works for non-varchar columns. Are there scenarios in which VARCHAR won't be suitable (certain column types or certain DB providers)?

Thanks.

Answer: 
> 
> According to the java docs of
>  PreparedStatement.setNull: "Note: You
>  must specify the parameter's SQL
>  type". What is the reason that the
>  method requires the SQL type of the
>  column?
> 
> 
> 

For maximum compatibility; as per the specification, there are some databases which don't allow untyped NULL to be sent to the underlying data source.

> 
> I noticed that passing
>  java.sql.Types.VARCHAR also works for
>  non-varchar columns. Are there
>  scenarios in which VARCHAR won't be
>  suitable (certain column types or
>  certain DB providers)?
> 
> 
> 

I don't think that sort of behaviour really is part of the specification or if it is, then I'm sure there is some sort of implicit coercion going on there. In any case, relying on such sort of behaviour which might break when the underlying datastore changes is not recommended. Why not just specify the correct type?
JDBC drivers appear to be moving away from `setNull`. See [Add support for setObject(<arg>, null)](https://issues.apache.org/jira/browse/DERBY-1938).

My list of databases supporting the more logical behaviour is:

1. Oracle
2. MySQL
3. Sybase
4. MS SQL Server
5. HSQL

My list of databases NOT supporting this logical behaviour is:

1. Derby [Queries with guarded null Parameter fail](https://issues.apache.org/jira/browse/DERBY-5629)
2. PostgreSQL [Cannot pass null in Parameter in Query for ISNULL](http://archives.postgresql.org/pgsql-jdbc/2011-11/msg00110.php) [Suggested solution](http://archives.postgresql.org/pgsql-jdbc/2011-12/msg00017.php)