補足のユニコード文字シマリスにOracleがJavaとは異なるバイト長を使用するのはなぜですか?
JavaコードでUTF-8文字列をOracle(11.2.0.4.0)列のサイズにトリミングすると、JavaとOracleは文字列を異なるバイト長として認識するため、エラーが発生します。NLS_CHARACTERSETOracleのパラメーターが「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(); } これはテストの最後の行で失敗し、次のメッセージが表示されます。 …