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: 
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)
When it comes to Oracle it would be very unwise to use varchar2 towards other datatypes. This might fool the optimizer and you could get an bad execution plan. For instance filtering on a date column using a timestamp datatype in your bind, Oracle could end up reading all your rows converting all dates to timestamp, then filtering out the wanted rows. 
If you have a index on your date column, it could even get worse (if oracle chose to use it) - doing single reads on your oracle blocks.

--Lasse