Skip to Main Content

Java Database Connectivity (JDBC)

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

Interested in getting your voice heard by members of the Developer Marketing team at Oracle? Check out this post for AppDev or this post for AI focus group information.

ORA-12704: character set mismatch when binding a NULL NVARCHAR value using PreparedStatement::setNull

Lukas EderJan 10 2025

I'm using com.oracle.database.jdbc:ojdbc11:23.6.0.24.10 against Oracle 23ai 23.4.0.24.05 from here: https://hub.docker.com/r/gvenzl/oracle-free

This produces an error:

try (PreparedStatement s = connection.prepareStatement(
   """
   SELECT ?
   UNION ALL
   SELECT N'Ö'
   """
)) {
   s.setNull(1, Types.NVARCHAR);
   
   try (ResultSet rs = s.executeQuery()) {
       while (rs.next())
           System.out.println(rs.getNString(1));
   }
}

The error being:

https://docs.oracle.com/error-help/db/ora-12704/
	at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:712)
	at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:612)
	at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:1364)
	at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:969)
	at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:237)
	at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:516)
	at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:275)
	at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:1232)
	at oracle.jdbc.driver.OracleStatement.prepareDefineBufferAndExecute(OracleStatement.java:1413)
	at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1287)
	at oracle.jdbc.driver.OracleStatement.executeSQLSelect(OracleStatement.java:1844)
	at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1620)
	at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3961)
	at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:4148)
	at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1117)
	at org.jooq.testscripts.JDBC.main(JDBC.java:47)
Caused by: Error : 12704, Position : 8, SQL = SELECT :1 UNION ALL
SELECT u'\00d6'
, Original SQL = SELECT ?
UNION ALL
SELECT N'Ö'
, Error Message = ORA-12704: character set mismatch

	at oracle.jdbc.driver.T4CTTIoer11.processError(T4CTTIoer11.java:720)
	... 15 more

I don't see why this should be a problem, since this works correctly:

try (PreparedStatement s = connection.prepareStatement(
   """
   SELECT ?
   UNION ALL
   SELECT N'Ö'
   """
)) {
   s.setNString(1, null);
   
   try (ResultSet rs = s.executeQuery()) {
       while (rs.next())
           System.out.println(rs.getNString(1));
   }
}

Printing the expected output:

null
Ö

I'd consider this a bug in ojdbc

Comments
Post Details
Added on Jan 10 2025
0 comments
40 views