Estoy tratando de utilizar el "New Methods for National Character Set Type Data in JDK 1.6", para obtener una solución estándar JDBCpara manejar caracteres cirílicos, pero cuando llega a la ejecución de cualquier línea con el tipo NVARCHAR, por ejemplo, :Types.NVARCHAR con controlador JDBC de Oracle para trabajar con caracteres cirílicos
preparedSelect.setObject(3, "суббота", Types.NVARCHAR);
entonces consigo esta excepción:
java.sql.SQLException: Invalid column type
at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.java:70)
at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:131)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:197)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:261)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:269)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:490)
at oracle.jdbc.driver.OraclePreparedStatement.setObjectCritical(OraclePreparedStatement.java:7922)
at oracle.jdbc.driver.OraclePreparedStatement.setObjectInternal(OraclePreparedStatement.java:7502)
at oracle.jdbc.driver.OraclePreparedStatement.setObject(OraclePreparedStatement.java:7975)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.setObject(OraclePreparedStatementWrapper.java:222)
también probé a usar setNString() pero me da una excepción aún más extraño:
java.lang.AbstractMethodError: oracle.jdbc.driver.OraclePreparedStatementWrapper.setNString(ILjava/lang/String;)V
Si uso java -Doracle.jdbc.defaultNChar = true myApplication con Types.VARCHAR normal, las palabras rusas se almacenan correctamente. Pero el uso de -Doracle.jdbc.defaultNChar = true no es una opción, ya que estoy trabajando en una aplicación heredada, no tengo el control del entorno de producción en ejecución, solo le estoy escribiendo un componente. Además, este "Readme for NChar How-to" establece que "esta conversión tiene un impacto sustancial en el rendimiento". Así que configurar todo para NChar por defecto cuando solo menos del 1% de mis tablas necesita esta conversión no es una opción inteligente.
Estoy usando el controlador fino de Oracle y tengo ojdbc6.jar y orai18n.jar en mi classpath.
Estoy buscando una solución JDBC estándar. No puedo usar ningún método o constantes con "oráculo" en ellos. OraclePreparedStatement no es una opción para mí.
Intenté usar Types.NVARCHAR con el servidor de MSSQL y funciona bien.
¿Usted intentó utilizar setNString() y ver si funciona? –
He editado mi pregunta con una actualización sobre setNString() –
Para descartar lo obvio: ¿has intentado llamar al viejo y viejo 'setString()'? He almacenado con éxito caracteres árabes con eso. –