我正在尝试使用"JDK 1.6中的国家字符集类型数据新方法",以获得一个标准的JDBC解决方案来处理西里尔字母,但是当执行到任何包含NVARCHAR类型的行时,例如:
我也尝试使用setNString(),但是我得到了一个更奇怪的异常:
如果我使用java -Doracle.jdbc.defaultNChar=true myApplication和普通的Types.VARCHAR,那么俄语单词会被正确存储。但是由于我正在处理遗留应用程序,因此不能使用-Doracle.jdbc.defaultNChar=true,我无法控制生产环境的运行,我只是为其编写组件。此外,"NChar How-to自述文件"指出,“这种转换具有实质性的性能影响”。因此,当只有不到1%的表需要执行此转换时,将所有内容默认设置为NChar并不是明智之选。
我使用的是Oracle Thin Driver,并且在我的类路径中有ojdbc6.jar和orai18n.jar。
我正在寻找标准的JDBC解决方案。我不能使用任何带有“oracle”常量或方法。对我来说,OraclePreparedStatement不是一个选择。
我尝试使用Types.NVARCHAR和MSSQL Server,它可以正常运行。
preparedSelect.setObject(3, "суббота", Types.NVARCHAR);
然后我得到了这个异常:
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)
我也尝试使用setNString(),但是我得到了一个更奇怪的异常:
java.lang.AbstractMethodError: oracle.jdbc.driver.OraclePreparedStatementWrapper.setNString(ILjava/lang/String;)V
如果我使用java -Doracle.jdbc.defaultNChar=true myApplication和普通的Types.VARCHAR,那么俄语单词会被正确存储。但是由于我正在处理遗留应用程序,因此不能使用-Doracle.jdbc.defaultNChar=true,我无法控制生产环境的运行,我只是为其编写组件。此外,"NChar How-to自述文件"指出,“这种转换具有实质性的性能影响”。因此,当只有不到1%的表需要执行此转换时,将所有内容默认设置为NChar并不是明智之选。
我使用的是Oracle Thin Driver,并且在我的类路径中有ojdbc6.jar和orai18n.jar。
我正在寻找标准的JDBC解决方案。我不能使用任何带有“oracle”常量或方法。对我来说,OraclePreparedStatement不是一个选择。
我尝试使用Types.NVARCHAR和MSSQL Server,它可以正常运行。
setString()
方法了吗?我曾经成功地使用它来存储阿拉伯字符。 - user330315