Драйвер JDBC не работает в ResultSet
. Было бы очень плохо, если бы это произошло. Посмотрите на этот простой пример:
Таблица базы данных x
содержит одну колонку value
. Есть две строки: одна с двухсимвольной строкой ('\'
и 'n'
) и одна ведьма с одной символьной строкой (символ новой строки). Я добавил строку длины для вывода для пояснения.
select *, length(value) from x;
value | length
-------+--------
\n | 2
+| 1
|
Эта таблица считывается с JDBC:
Connection db = DriverManager.getConnection(/* these parameters are up to you */);
Statement st = db.createStatement();
ResultSet rs = st.executeQuery("select value, length(value) from x");
while(rs.next()){
String value = rs.getString(1);
int length = rs.getInt(2);
System.out.println("length="+length+", value='"+value+"'");
}
Вы видите: нет явного не избежать в коде до сих пор. И выход:
length=2, value='\n'
length=1, value='
'
Вы видите: до сих пор ничего не ускользнуло - ни кодом, ни JDBC.
НО
Вещи становится немного мутным, если вы смешиваете в Java литералах: Если вы делаете что-то вроде этого:
st.execute("insert into x values ('\n')");
тогда догадаться, что случилось? У вас есть еще один ряд с один персонаж!
length=2, value='\n'
length=1, value='
'
length=1, value='
'
Это происходит потому, что Java компилятор переводится двумя символами «\ п» в один символ новой строки. Следовательно, драйвер JDBC и база данных видят только один символ.
Но если бы вы прочитали некоторый пользовательский ввод, и пользователь набрал бы \
и n
, тогда никто не уклонился от этого, и строка содержала бы два символа.
Следующий шаг
Вы говорите, вы явно де-спасаясь с помощью StringEscapeUtils
. Тогда это произойдет:
- Строка с одним символом будет передаваться без изменений из БД на экран.
- Строка с двумя символами будет изменена на
StringEscapeUtils
в строку, содержащую один символ. После этого обе строки выглядят одинаково для вас.
Резюме
Не путайте Стринг-Буквальное избежать компилятором вытекания от JDBC (который не будет).
Не добавляйте лишние экранирующие слои.
Похоже, что JDBC избегает всех специальных характеристик, чтобы текст отображался так, как он хранится в БД. Итак, если у вас есть * hello \ nworld * в БД, он станет «hello \\ nworld», когда он будет извлечен. Выглядит так, как должно быть. – svz
@svz JDBC ничего не скрывает в 'ResultSet'. __That__ так оно и должно быть. В противном случае многие приложения будут иметь проблемы, чтобы знать, что действительно находится в БД, и что изменил какой-то произвольный уровень. –