Posted at

JDBCでsjisなMySQLやMariaDBにWindowsネイティブな文字列を突っ込む

More than 1 year has passed since last update.

自分用メモのような日記

会社に古いDBからインポートしたcp932_japanese_ci(MS932/SJIS)なMySQLがあった。

クライアント「『㈱』とかが入った文字列突っ込むとなんか落ちます!!!」

Javaは悪くない。Javaはいい子だった。

問題はJDBCのSQLパーサーらしい。おのれOracleめ!!手抜きするな~!

しかし、Oracle社に恨み言言ってもしょうがない。だって無料コンポーネントだしね・・

ふと、昔BLOBなんかでバイナリ突っ込む時につかった魔法を思い出す。

文字列を16進数に変換して突っ込む魔法。

import javax.xml.bind.DatatypeConverter;

private String toHexString(String value)
{
try
{
byte[] data = value.getBytes("Windows-31J");
String hex = DatatypeConverter.printHexBinary(data);
if (hex.length() > 0) {
return "0x" + hex;
}
return "''";
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
return "'" + value + "'";
}

バインドする部分に噛ましたら16進数な文字列になって登録されてしまった・・・。

そりゃそうよね・・・。

なので、prepareするところに直に入れ込むことにした。

無事動いた。ひゃっほー!!

(バインドしなくていいの?)

(ループさせたりするとちょっと遅くなるけど、でも落ちるよりマシじゃね?)

(だよね)

知らない。SJISなDB建てたのが悪いんだ・・・