Как мне работать с кавычками в SQL [дубликат]

StackOverflow https://stackoverflow.com/questions/29699

  •  09-06-2019
  •  | 
  •  

Вопрос

На этот вопрос уже есть ответ здесь:

У меня есть база данных с именами, такими как Джон Доу и т. д.К сожалению, некоторые из этих имен содержат такие цитаты, как Кейран О'Киф.Теперь, когда я пытаюсь найти такие имена следующим образом:

SELECT * FROM PEOPLE WHERE SURNAME='O'Keefe' 

Я (по понятным причинам) получаю сообщение об ошибке.

Как предотвратить возникновение этой ошибки.Я использую Oracle и PLSQL.

Это было полезно?

Решение

Escape-символ — ', поэтому вам придется заменить кавычку двумя кавычками.

Например,

SELECT * FROM PEOPLE WHERE SURNAME='O'Keefe'

становится

SELECT * FROM PEOPLE WHERE SURNAME='O''Keefe'

Тем не менее, вероятно, неправильно делать это самостоятельно.В вашем языке может быть функция экранирования строк для использования в SQL, но еще лучший вариант — использовать параметры.Обычно это работает следующим образом.

Ваша команда SQL будет такой:

SELECT * FROM PEOPLE WHERE SURNAME=?

Затем, когда вы его выполняете, вы передаете «О'Киф» в качестве параметра.

Поскольку SQL анализируется до установки значения параметра, значение параметра не может изменить структуру SQL (и это даже немного быстрее, если вы хотите выполнить один и тот же оператор несколько раз с разными параметрами).

Я также должен отметить, что, хотя ваш пример просто вызывает ошибку, вы подвергаете себя множеству других проблем, не экранируя строки должным образом.Видеть http://en.wikipedia.org/wiki/SQL_injection для хорошей отправной точки или следующей классики xkcd комикс.

alt text

Другие советы

Решение Oracle 10

SELECT * FROM PEOPLE WHERE SURNAME=q'{O'Keefe}'

Параметризованные запросы — ваш друг, как предложил Мэтт.

Command = SELECT * FROM PEOPLE WHERE SURNAME=?

Они защитят вас от головных болей, связанных с

  • Строки с кавычками
  • Запрос с использованием дат
  • SQL-инъекция

Использование параметризованного SQL имеет и другие преимущества: оно снижает нагрузку на ЦП (а также другие ресурсы) в Oracle за счет уменьшения объема работы, которую Oracle требует для анализа оператора.Если вы не используете параметры (в Oracle мы называем их переменными привязки), то «select * from foo, где bar='cat'» и «select * from foo, где bar='dog'» рассматриваются как отдельные операторы, где как « select * from foo, где bar=:b1" — это тот же оператор, означающий, что такие вещи, как синтаксис, достоверность объектов, на которые имеются ссылки, и т. д.... не нужно проверять снова.При использовании переменных связывания время от времени возникают проблемы, которые обычно проявляются в невозможности получения наиболее эффективного плана выполнения SQL, но для этого есть обходные пути, и эти проблемы действительно зависят от используемых вами предикатов, индексации и искажения данных.

Фильтрация ввода обычно выполняется на уровне языка, а не на уровнях базы данных.
php и .NET имеют свои соответствующие библиотеки для экранирования операторов sql.Проверьте свой язык, посмотрите, что доступно.
Если ваши данные заслуживают доверия, вы можете просто заменить строку, чтобы добавить еще одну ' перед ', чтобы избежать ее.Обычно этого достаточно, если нет риска, что введенные данные являются вредоносными.

Полагаю, хороший вопрос: какой язык вы используете?
В PHP вы бы сделали:ВЫБЕРИТЕ * ИЗ ЛЮДЕЙ, ГДЕ ФАМИЛИЯ = 'mysql_escape_string (О'Киф)'
Но поскольку вы не указали язык, я предлагаю вам изучить функцию escape-строки mysql или что-то еще на вашем языке.

Чтобы работать с котировками, если вы используете Zend Framework, вот код

$db = Zend_Db_Table_Abstract::getDefaultAdapter();

$db->quoteInto('your_query_here = ?','your_value_here');

например ;

//SELECT * FROM PEOPLE WHERE SURNAME='O'Keefe' will become
SELECT * FROM PEOPLE WHERE SURNAME='\'O\'Keefe\''

Найдено в возрасте до 30 лет в Google...

Часто задаваемые вопросы по Oracle SQL

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top