Как правильно экранировать строки без PreparedStatement? - PullRequest
1 голос
/ 27 июля 2011

Я использую операторы для executeUpdate и executeQuery.Строковые значения, которые я объединяю в запросе SQL, могут содержать как минимум символ '\, так же как и Unicode.

PreparedStatement, кажется, делает это автоматически, но есть ли какая-нибудь служебная функция в библиотеке JDBC для выходапроизвольная строка для использования в запросе SQL?

Примеры ошибок, с которыми я столкнулся:

org.postgresql.util.PSQLException: ERROR: unterminated quoted string at or near

и

org.postgresql.util.PSQLException: ERROR: invalid Unicode escape
  Hint: Unicode escapes must be \uXXXX or \UXXXXXXXX.

Ответы [ 2 ]

5 голосов
/ 27 июля 2011

Нет, он не является частью JDBC и отличается для разных систем управления базами данных. Вы действительно должны использовать PreparedStatement для запросов с параметрами. Это более безопасно и может работать лучше, так как запрос может быть скомпилирован.

См. 4.1. Синтаксис SQL - Лексическая структура в руководстве по PostgreSQL.

1008 * Е.Г. *

В следующем, менее тривиальном примере русское слово «слон» (слон) пишется кириллицей:

U&"\0441\043B\043E\043D"
1 голос
/ 27 июля 2011

JDBC делает это так:

QueryExecutorImpl.parseQuery ()

  • Разбивает строку на фрагменты, обрабатывает одинарные кавычки, двойные кавычки, комментарии к строке, комментарии к блоку, долларзнаки и принимает к сведению?для подстановки.
  • Создает объект SimpleQuery

SimpleParameterList

  • Обрабатывает кодирование строк (UTF-8, bytea и т. д.)

К сожалению, чтобы получить экранирование полной строки (с кодированием, обработкой специальных символов и т. Д.), Вам, вероятно, потребуется каким-то образом получить доступ и использовать QueryExecutorImpl, и я не смог понять, как это сделатьтот.PreparedStatement внутренне использует QueryExecutorImpl.

Вывод, лучший и самый простой способ - это, вероятно, использовать PreparedStatement.

...