Как мне работать с кавычками в SQL [дубликат]
Вопрос
На этот вопрос уже есть ответ здесь:
У меня есть база данных с именами, такими как Джон Доу и т. д.К сожалению, некоторые из этих имен содержат такие цитаты, как Кейран О'Киф.Теперь, когда я пытаюсь найти такие имена следующим образом:
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 комикс.
Другие советы
Решение 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...