Java PreparedStatement с использованием двух одинарных кавычек для параметра пустой строки - PullRequest
7 голосов
/ 11 февраля 2011

Я использую PreparedStatement с sql, например:

String sql = "insert into foo (a,b,c) values (?,?,?)";
 ps = conn.prepareStatement(sql);

  ps.setString(psIndex++, a);
  ps.setString(psIndex++, b);
  ps.setString(psIndex++, c);

Но если любая из переменных является пустой строкой, результирующий оператор получает две одинарные кавычки.Как в: VALUES ('foo','','') Тогда я получаю исключение, поскольку две одинарные кавычки - это escape-последовательность.

Не могу поверить, что ничего не нашел по этому поводу, но не смог.Что здесь происходит?

Ответы [ 6 ]

3 голосов
/ 27 декабря 2011

Поскольку ОП не делает то, что предложил @ Адам в комментариях, я сделаю это.Это полезно для будущих читателей.Спасибо @ user119179 за идею.

Это может быть ошибка в используемом нами драйвере JDBC .Поставщик драйвера должен знать, что '' является escape-последовательностью.

На самом деле, обновление драйвера, похоже, решает ошибку для OP.

2 голосов
/ 12 февраля 2011

Как в: VALUES ('foo', '', '') Затем я получаю исключение, поскольку две одинарные кавычки являются escape-последовательностью.

Здесь есть недоразумение. Две одинарные кавычки - это пустая строка. Последовательности побега не происходит. Это экранированная кавычка, только если она находится в другой одинарной кавычке. Если вы получаете исключение, оно, вероятно, в другом месте, например, ограничение на столбец в базе данных.

Заявление

insert into foo (a,b,c) values ('foo','','')

очень правильный SQL.

0 голосов
/ 10 января 2019

Вы не поделились своим Java Exception, и это помогло бы в формулировании точного ответа.

В вашей программе есть два аспекта - ограничения Java и DB.

Для Java пустая строка равна "" (это двойные кавычки, а не одинарные кавычки), поэтому ваши ссылки на Java - a, b & c имеют это значение, когда значение пустое, я не знаю Не вижу никаких проблем в отношении PreparedStatement. Вам не нужно беспокоиться о escape-последовательности в одинарных кавычках, если используете PreparedStatement. Я не уверен, почему вы перечисляете значения как ['foo','',''], это должно быть ["foo","",""].

Второй аспект - то, что столбцы вашей БД a, b & c могут не разрешать пустые значения из-за ограничений, - это совсем другое дело и не может контролироваться с помощью Java-кода. Табличная схема БД должна быть изменена, чтобы разрешить значения по умолчанию в этом случае.

Обсуждение escape-последовательности в одинарных кавычках актуально, когда кто-то готовит SQL-запрос, напрямую добавляя значения в строку запроса, например, "insert into foo (a,b,c) values ('foo','','')"; или предложение WHERE с a='foo'. Этот способ не рекомендуется из-за уязвимостей SQL-инъекций.

0 голосов
/ 25 сентября 2012

Заменить одинарную кавычку ' значением UNICODE \u2019.Для более подробной информации нажмите на этот URL

0 голосов
/ 12 февраля 2011

@ cyberkiwi правильно. Может быть, ваши столбцы не принимают нулевые значения. Какое исключение вы получаете? Если у вас есть какие-либо отчеты журнала, поделитесь ими.

0 голосов
/ 11 февраля 2011

РЕДАКТИРОВАТЬ: Как уже отмечали другие, вы не должны делать ничего особенного, чтобы передать пустую строку в параметризованный запрос.

Но, на всякий случай , если вы используете динамический SQL в запросе, подобном:

Declare sqlText VARCHAR(MAX)
set sqlText = 'SELECT ....'
EXEC(sqlText)

тогда вам нужно будет экранировать каждую из одинарных кавычек как '''', чтобы получить эквивалент пустой строки. Итак, всего 4 цитаты. Первые 2 одинарные кавычки будут эквивалентны получению одинарных кавычек во время выполнения. Еще 2 одинарные кавычки получат заключительную кавычку во время выполнения.

...