JavaコードでUTF-8文字列をOracle(11.2.0.4.0)列のサイズにトリミングすると、JavaとOracleは文字列を異なるバイト長として認識するため、エラーが発生します。NLS_CHARACTERSET
Oracleのパラメーターが「UTF8」であることを確認しました。
ユニコードシマリス絵文字を使用して、以下の問題を説明するテストを書きました(🐿️)
public void test() throws UnsupportedEncodingException, SQLException {
String squirrel = "\uD83D\uDC3F\uFE0F";
int squirrelByteLength = squirrel.getBytes("UTF-8").length; //this is 7
Connection connection = dataSource.getConnection();
connection.prepareStatement("drop table temp").execute();
connection.prepareStatement("create table temp (foo varchar2(" + String.valueOf(squirrelByteLength) + "))").execute();
PreparedStatement statement = connection.prepareStatement("insert into temp (foo) values (?)");
statement.setString(1, squirrel);
statement.executeUpdate();
}
これはテストの最後の行で失敗し、次のメッセージが表示されます。
ORA-12899:列
"MYSCHEMA"。 "TEMP"。 "FOO"の値が大きすぎます(実際:9、最大:7)
の設定はNLS_LENGTH_SEMANTICS
ですBYTE
。残念ながら、これはレガシーシステムなので変更できません。列サイズの増加には興味がなく、文字列のOracleサイズを確実に予測できます。