Created
June 1, 2012 13:33
-
-
Save tmd45/2852172 to your computer and use it in GitHub Desktop.
Cutting by byte, MS932 character. After, insert this String to Oracle DB by jdbc, whereupon get ORA-12899
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** 分割開始インデックス */ | |
static final int DIVISION_BYTE_START_INDEX = 0; | |
/** 分割後文字長 */ | |
static final int DIVISION_BYTE_LENGTH_ADDR = 48; | |
/** | |
* 引数の文字列を[分割後文字長(byte)]以下にカットする。<br> | |
* 扱う文字コードは MS932 とする。 | |
* | |
* @param str 文字列(MS932) | |
* @return String [分割後文字長(byte)]以下の文字列 | |
*/ | |
String getDivideStringByByte(String str) { | |
if(str == null) { | |
return null; | |
} | |
String result = ""; | |
try { | |
// バイト配列化 | |
byte[] byteAddr = address.getBytes("MS932"); | |
if(byteAddr.length > DIVISION_BYTE_START_INDEX) { | |
// byte文字列が分割開始インデックス以上の長さである | |
if(byteAddr.length > DIVISION_BYTE_START_INDEX + DIVISION_BYTE_LENGTH_ADDR) { | |
// byte文字列が分割したい文字長以上の長さである | |
result = new String(byteAddr, | |
DIVISION_BYTE_START_INDEX, | |
DIVISION_BYTE_LENGTH_ADDR, | |
"MS932").trim(); | |
} else { | |
// 必要文字長に満たない場合 | |
result = new String(byteAddr, | |
DIVISION_BYTE_START_INDEX, | |
byteAddr.length - DIVISION_BYTE_START_INDEX, // 長さ:文字長 - 分割(開始)位置 | |
"MS932").trim(); | |
} | |
// いわゆる“おまじない”コード(恥) | |
// result = new String(result.getBytes("MS932")); | |
} catch(UnsupportedEncodingException ue) { | |
throw new IllegalArgumentException(ue); | |
} | |
return result; | |
} | |
} |
ちなみにデータベースの文字コードは Shift_JIS(JA16SJISTILDE)。
当初は Shift_JIS と MS932 の文字の問題でよくある「~」とか「-」のせいだと思って調査していたが違ったんだぜ、っていう紆余曲折。
JDK 1.5.0_12
Qiita に突っ込んできた。 http://qiita.com/items/fa7e4fdbd4f7ad9a29ae
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
引数の文字列において、分割される文字列に半角文字(1byte文字)を含むと、切り口(47-48byte)の文字がぶった切られて文字化けする。
例:
これをそのままデータベース(oracle)へ insert しようとしたところ、ORA-12899 エラーになった。
カラムに定義された文字長=分割文字長であり、たとえば上記の例であれば:
JDBC(ojdbc14)で insert する直前の値を確認したとき、以下の2パターンが存在した。
前者は末尾の文字が全角の「?」になっている:
1 の場合に ORA-12899 エラーが発生している。
1 は、上記のコードで生成された文字列を用いている。
2 は、上記のコードの おまじない を有効にした場合の文字列を用いている。
1 と 2 の文字列は、(JDBCへ渡す前は)全く同じ文字列に見える:
しかし、String#equals で比較すると「異なる」と判断される。
String#equals は各文字を char で比較する。char にしたときの各文字は 以下のようになる:
上記の正しい理由と正しい解決方法を模索中。。。