У меня есть база данных с именами в ней, например, Джон Доу и т. д. К сожалению, некоторые из этих имен содержат кавычки, например, Кейран О'Киф. Теперь, когда я пытаюсь найти такие имена, как:
SELECT * FROM PEOPLE WHERE SURNAME='O'Keefe'
Я (по понятным причинам) получаю сообщение об ошибке.
Как предотвратить появление этой ошибки. Я использую Oracle и PLSQL.


Найдено в Google в возрасте до 30 лет ...
Входная фильтрация обычно выполняется на уровне языка, а не на уровне базы данных. php и .NET имеют свои соответствующие библиотеки для экранирования операторов sql. Проверьте свой язык, узнайте, что доступно. Если ваши данные заслуживают доверия, вы можете просто заменить строку, чтобы добавить еще одну «перед», чтобы избежать ее. Обычно этого достаточно, если нет никаких рисков, что ввод злонамерен.
Полагаю, хороший вопрос: какой язык вы используете?
В PHP вы бы сделали: SELECT * FROM PEOPLE WHERE SURNAME = 'mysql_escape_string (O'Keefe)'
Но поскольку вы не указали язык, я предлагаю вам изучить функцию escape-строки mysql или иным образом на вашем языке.
mysqli_real_escape_string() для более современного подхода.
Экранирующий символ - ', поэтому вам нужно будет заменить кавычки двумя кавычками.
Например,
SELECT * FROM PEOPLE WHERE SURNAME='O'Keefe'
становится
SELECT * FROM PEOPLE WHERE SURNAME='O''Keefe'
Тем не менее, делать это самостоятельно, вероятно, неправильно. В вашем языке может быть функция экранирования строк для использования в SQL, но еще лучше использовать параметры. Обычно это работает следующим образом.
Ваша команда SQL будет:
SELECT * FROM PEOPLE WHERE SURNAME=?
Затем, когда вы его выполняете, вы передаете "O'Keefe" в качестве параметра.
Поскольку SQL анализируется до установки значения параметра, значение параметра не может изменить структуру SQL (и даже немного быстрее, если вы хотите выполнить один и тот же оператор несколько раз с разными параметрами).
Я также должен отметить, что, хотя ваш пример просто вызывает ошибку, вы открываете для себя множество других проблем, не экранируя строки соответствующим образом. См. http://en.wikipedia.org/wiki/SQL_injection для хорошей отправной точки или следующий классический xkcd комикс.

+1 за рекомендацию переменных связывания. Если вы используете переменные связывания, таких раздражающих вещей никогда не бывает, и ваши запросы лучше, и вы не подвержены атакам с помощью SQL-инъекций.
Большое спасибо, вы только что спасли мне день :). Хотел бы я +2 к этим сообщениям. Хороший мультфильм тоже :)
Как предлагает Мэтт, параметризованные запросы - ваш друг.
Command = SELECT * FROM PEOPLE WHERE SURNAME=?
Они защитят вас от головной боли, связанной с
Использование параметризованного SQL имеет и другие преимущества: оно снижает нагрузку на ЦП (а также другие ресурсы) в Oracle за счет уменьшения объема работы, необходимой Oracle для синтаксического анализа оператора. Если вы не используете параметры (в Oracle мы называем их переменными связывания), то «select * from foo, где bar = 'cat'» и «select * from foo, где bar = 'dog'» рассматриваются как отдельные операторы, где как « select * from foo, где bar =: b1 "- это тот же оператор, что означает, что такие вещи, как синтаксис, достоверность объектов, на которые есть ссылки, и т. д. не нуждаются в повторной проверке. При использовании переменных связывания возникают случайные проблемы, которые обычно проявляются в том, что не удается получить наиболее эффективный план выполнения SQL, но для этого есть обходные пути, и эти проблемы действительно зависят от используемых вами предикатов, индексации и перекоса данных.
Решение Oracle 10 - это
SELECT * FROM PEOPLE WHERE SURNAME=q'{O'Keefe}'
голос против. Даже с Oracle вы должны использовать параметризованные запросы.
Чтобы разобраться с котировками, если вы используете 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\''
См. Использование строковых литералов в одинарных кавычках