Zestaw znaków Oracle JDBC i limit 4000 znaków

Próbujemy przechowywać łańcuch zakodowany w UTF-16 w bazie danych Oracle AL32UTF8.

Nasz program działa idealnie na bazie danych, która używaWE8MSWIN1252 jako zestaw znaków. Kiedy próbujemy uruchomić go w bazie danych, która używaAL32UTF8 dostaje się dojava.sql.SQLException: ORA-01461: can bind a LONG value only for insert into a LONG column.

W poniższym przykładzie wszystko działa dobrze, dopóki nasze dane wejściowe nie są zbyt długie.

Ciąg wejściowy może przekraczać 4000 znaków. Chcemy zachować jak najwięcej informacji, nawet jeśli zdamy sobie sprawę, że dane wejściowe będą musiały zostać odcięte.

Nasze tabele bazy danych są definiowane przy użyciuCHAR słowo kluczowe (patrz poniżej). Mieliśmy nadzieję, że pozwoli nam to przechowywać do 4000 znaków dowolnego zestawu znaków.Czy można to zrobić? Jeśli tak to jak?

Próbowaliśmy przekonwertować ciąg naUTF8 używaćByteBuffer bezskutecznie.OraclePreparedStatement.setFormOfUse(...) też nam nie pomógł.

Przełączanie naCLOB nie jest opcją. Jeśli sznur jest za długi, należy go przeciąć.

To jest nasz kod w tej chwili:

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

To jest skrypt tworzenia prostej tabeli:

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

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

Przypadek testowy działa idealnie na krótkich danych. Na długich danych nadal pojawia się błąd. Nawet kiedy naszalongData ma tylko 3000 znaków, nadal nie działa poprawnie.

Z góry dziękuję!

questionAnswers(2)

yourAnswerToTheQuestion