2

Java コードで長さチェックを持つフィールドを使用して、DB2 データベースにレコードを保存しようとしているという問題が 1 つあります。長さチェックをデータベースの varchar 制限と正確に同じに保ちました。保存しようとしましたが、SQL Exception DB2 SQL Error: SQLCODE=-302, SQLSTATE=22001, SQLERRMC=null, DRIVER=3.57.82; が発生しました。

次に、データベースのサイズよりも短い長さ (切り捨て) を減らしました。varchar(1000) の部分文字列 (0, 900) に切り捨てられます。

同じ理由が何であるか教えてください。文字エンコーディングに関連していますか?どのように処理する必要がありますか?

文字列(テキストエリアフィールドのリクエストパラメータからの入力)に適用されるデフォルトの文字エンコーディングと対応する番号は何ですか。バイトの?

4

1 に答える 1

3

DB2 は文字列の長さを文字数ではなくバイト数で数えます。したがって、格納できる文字列の最大長は、varchar に指定されたサイズよりもはるかに短くなる可能性があります。

残念ながら、文字列をバイト数に切り詰める唯一の方法は、文字列をバイトとしてエンコードし、切り捨てて、文字列を再構築することです。あなたの言うことから、UTF-8 などの可変長エンコーディングが使用されているように聞こえます。難しい部分は、最後に無効な文字を生成しないことです。これを行う方法は、NIO charset API を使用することです。

import java.nio.*;
...
CharBuffer in = CharBuffer.wrap(stringToTruncate);
ByteBuffer out = ByteBuffer.allocate(maxLength);
Charset db2charset = Charset.forName("UTF-8");
CharsetEncoder db2encoder = db2charset.newEncoder();
db2encoder.encode(in, out, true);
out.flip();
return db2charset.decode(out).toString();
于 2013-10-09T19:10:41.363 に答える