Мы пытаемся сохранить строку в кодировке 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 символов любого набора символов. Можно ли это сделать? Если да, то как?
Мы безуспешно пытались преобразовать String в 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 символов, он все равно не выполняется успешно.
Заранее спасибо!