「 JDK1.6のNationalCharacterSet Type Dataの新しいメソッド」を使用して、キリル文字を処理する標準のJDBCソリューションを取得しようとしていますが、実行がNVARCHARタイプの行に到達すると、たとえば次のようになります。
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を使用することはできません。これは、レガシーアプリケーションで作業しているため、実行中の本番環境を制御できず、コンポーネントを書き込んでいるだけです。さらに、この「Readme for NChar How-to」には、「この変換はパフォーマンスに大きな影響を与える」と記載されています。したがって、テーブルの1%未満しかこの変換を必要としない場合、デフォルトですべてをNCharに設定するのは、賢明な選択ではありません。
oracleシンドライバーを使用しており、クラスパスにojdbc6.jarとorai18n.jarがあります。
標準のJDBCソリューションを探しています。「oracle」が付いたメソッドや定数は使用できません。OraclePreparedStatementは私にとってオプションではありません。
MSSQL ServerでTypes.NVARCHARを使用してみましたが、正常に動作します。