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!

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
237 views