h-kouji
@h-kouji (浩二郎 平田)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

JDBCドライバへの文字コード設定について

JDBCドライバの文字コード設定について教えてください。

JavaでJDBCドライバを使用して、OracelDBへ接続するシステムがあります。
JDBCドライバのOracle接続用インスタンスには通常文字コードを設定すると思います。(推奨されているはず)

// 接続文字列 例
String url = "jdbc:oracle:thin:@localhost:1521:ORCL?useUnicode=true&characterEncoding=MS932";

上記の例では、「characterEncoding=MS932"」を設定していますが、設定しなかった場合どのような挙動になりますでしょうか?

一旦私の理解でいうと、文字コードが設定されていない場合、JDBCドライバは自動でJVMの文字コードを使用するかと思いましたが、システム上でサンプルコードを入れて確認してみると、思っていた結果にはならなかったです。

System.out.println("file.encoding : " + System.getProperty("file.encoding"));
System.out.println("sun.jnu.encoding : " + System.getProperty("sun.jnu.encoding"));
Charset defaultCharset = Charset.defaultCharset();
System.out.println("Default Charset : " + defaultCharset);

//SQL実行
ResultSet resultSet = select(sqlBuffer,parameters);

//結果取得
System.out.println("Shift-Jis : " + new String(resultSet.getBytes("TEST_NAME"),"Shift-Jis"));
System.out.println("MS932 : " + new String(resultSet.getBytes("TEST_NAME"),"MS932"));
System.out.println("windows-31j : " + new String(resultSet.getBytes("TEST_NAME"),"windows-31j"));
System.out.println("UTF-8 : " + new String(resultSet.getBytes("TEST_NAME"),"UTF-8"));
System.out.println("UTF-16 : " + new String(resultSet.getBytes("TEST_NAME"),"UTF-16"));

上記を実行した場合、
JVMは文字コードMS932を認識しており、

file.encoding : MS932
sun.jnu.encoding : MS932
Default Charset : windows-31j

デコードの結果はUTF-8以外は文字化けしていました。

Shift-Jis : 蝗エ蝗蜃オ蝗
MS932 : 蝗エ蝗蜃オ蝗
windows-31j : 蝗エ蝗蜃オ蝗
UTF-8 : 文字化けなし
UTF-16 : ・???蝗???

MS932が文字化けせず、他が文字化けするかと思っていましたが、理解が間違ってますでしょうか?

0

1Answer

Comments

  1. @h-kouji

    Questioner

    @h_kono0707
    ありがとうございます!
    上記のソースの結果は正しいということですね。

    つまり、検索リクエスト/検索結果はUTF-8で投げられ、UTF-8で帰ってくると理解しました。

    上記の理解が合っていて、OracleDBがUTF-8以外の文字コード設定になっている場合、
    更新処理は文字化けしたデータが入る可能性があるということでしょうか?

Your answer might help someone💌