UTF-16 でエンコードされた文字列を AL32UTF8 Oracle データベースに格納しようとしています。
私たちのプログラムは、文字セットとして使用するデータベースで完全に動作しますWE8MSWIN1252
。それを使用するデータベースで実行しようとするとAL32UTF8
、java.sql.SQLException: ORA-01461: can bind a LONG value only for insert into a LONG column
.
以下のテストケースでは、入力データが長くなりすぎない限り、すべて正常に動作します。
入力文字列は 4000 文字を超えることができます。入力を遮断する必要があることはわかっていますが、できるだけ多くの情報を保持したいと考えています。
データベース テーブルは、CHAR
キーワードを使用して定義されます (以下を参照)。これにより、任意の文字セットの最大 4000 文字を保存できるようになることを期待していました。これはできますか?もしそうなら、どのように?
StringUTF8
を a を使用するように変換しようとしましたが、ByteBuffer
成功しませんでした。OraclePreparedStatement.setFormOfUse(...)
また、私たちを助けませんでした。
a への切り替えCLOB
はオプションではありません。紐が長すぎる場合はカットが必要です。
これは現時点でのコードです。
public static void main(String[] args) throws Exception {
String ip ="193.53.40.229";
int port = 1521;
String sid = "ora11";
String username = "obasi";
String password = "********";
String driver = "oracle.jdbc.driver.OracleDriver";
String url = "jdbc:oracle:thin:@" + ip + ":" + port + ":" + sid;
Class.forName(driver);
String shortData = "";
String longData = "";
String data;
for (int i = 0; i < 5; i++)
shortData += "é";
for (int i = 0; i < 4000; i++)
longData += "é";
Connection conn = DriverManager.getConnection(url, username, password);
PreparedStatement stat = null;
try {
stat = conn.prepareStatement("insert into test_table_short values (?)");
data = shortData.substring(0, Math.min(5, shortData.length()));
stat.setString(1, data);
stat.execute();
stat = conn.prepareStatement("insert into test_table_long values (?)");
data = longData.substring(0, Math.min(4000, longData.length()));
stat.setString(1, data);
stat.execute();
} finally {
try {
stat.close();
} catch (Exception ex){}
}
}
これは単純なテーブルの作成スクリプトです。
CREATE TABLE test_table_short (
DATA VARCHAR2(5 CHAR);
);
CREATE TABLE test_table_long (
DATA VARCHAR2(4000 CHAR);
);
テストケースは短いデータで完全に機能します。ただし、長いデータではエラーが発生し続けます。longData
3000 文字しかない場合でも、正常に実行されません。
前もって感謝します!