Oracle JDBC-Zeichensatz und maximal 4000 Zeichen

Wir versuchen, einen UTF-16-codierten String in einer AL32UTF8-Oracle-Datenbank zu speichern.

Unser Programm funktioniert perfekt auf einer Datenbank, die verwendetWE8MSWIN1252 als Zeichensatz. Wenn wir versuchen, es auf einer Datenbank auszuführen, die verwendetAL32UTF8 es kommt zu einemjava.sql.SQLException: ORA-01461: can bind a LONG value only for insert into a LONG column.

Im Testfall unten funktioniert alles einwandfrei, solange unsere Eingabedaten nicht zu lang werden.

Die Eingabezeichenfolge kann mehr als 4000 Zeichen umfassen. Wir möchten so viele Informationen wie möglich behalten, obwohl wir erkennen, dass die Eingabe abgeschnitten werden muss.

Unsere Datenbanktabellen werden mit dem definiertCHAR Stichwort (siehe unten). Wir hofften, dass dies uns erlauben würde, bis zu 4000 Zeichen eines beliebigen Zeichensatzes zu speichern.Kann das gemacht werden? Wenn das so ist, wie?

Wir haben versucht, den String in zu konvertierenUTF8 Verwendung einerByteBuffer ohne Erfolg.OraclePreparedStatement.setFormOfUse(...) hat uns auch nicht weitergeholfen.

Wechseln zu aCLOB ist keine Option. Wenn die Schnur zu lang ist, muss sie abgeschnitten werden.

Dies ist momentan unser Code:

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){}
    }
}

Dies ist das Erstellungsskript der einfachen Tabelle:

CREATE TABLE test_table_short (
    DATA    VARCHAR2(5 CHAR);
);

CREATE TABLE test_table_long (
    DATA    VARCHAR2(4000 CHAR);
);

Der Testfall funktioniert einwandfrei mit den Kurzdaten. Bei den langen Daten wird jedoch immer wieder der Fehler angezeigt. Auch wenn unserelongData ist nur 3000 Zeichen lang und wird immer noch nicht erfolgreich ausgeführt.

Danke im Voraus!

Antworten auf die Frage(2)

Ihre Antwort auf die Frage