Oracle JDBC charset и ограничение в 4000 знаков

Мы пытаемся сохранить строку в кодировке UTF-16 в базе данных Oracle AL32UTF8.

Наша программа отлично работает на базе данных, которая используетWE8MSWIN1252 как кодировка. Когда мы пытаемся запустить его в базе данных, которая используетAL32UTF8 доходит доjava.sql.SQLException: ORA-01461: can bind a LONG value only for insert into a LONG column.

В приведенном ниже тесте все работает нормально, пока наши входные данные не становятся слишком длинными.

Входная строка может превышать 4000 символов. Мы хотим сохранить как можно больше информации, хотя мы понимаем, что входные данные должны быть отключены.

Наши таблицы базы данных определены с использованиемCHAR ключевое слово (см. ниже). Мы надеялись, что это позволит нам хранить до 4000 символов любого набора символов.Can this be done? If so, how?

Мы попытались преобразовать строку вUTF8 используяByteBuffer безуспешно.OraclePreparedStatement.setFormOfUse(...) также не помогли нам.

Переключение на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 символов, но он по-прежнему не выполняется успешно.

Заранее спасибо!

Ответы на вопрос(2)

Ваш ответ на вопрос