2008-08-27 2 views
11

У меня есть база данных с именами в ней, такими как John Doe и т. Д. К сожалению, некоторые из этих имен содержат цитаты типа Keiran O'Keefe. Теперь, когда я попытаюсь найти такие имена, выполните следующие действия:Как мне работать с кавычками? В SQL

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

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

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

+0

См [** Цитирование строкового литерала метод для одной кавычки **] (http://lalitkumarb.com/2014/12/31/quoting-string-literal-technique-to-avoid-erros -due-to-single-quotation-marks-in-the-string /) – 2015-12-18 06:29:53

ответ

30

Эквивалентный символ: ', поэтому вам нужно заменить цитату двумя кавычками.

Например,

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 comic.

alt text

+0

+1 для рекомендации переменных привязки. Если вы используете переменные связывания, то такие неприятные вещи никогда не бывают, а ваши запросы лучше, и вы не открыты для атак SQL-инъекций. – 2009-08-27 12:57:58

+0

Спасибо, вы просто спасли мой день :). Желаю, чтобы я мог +2 этих сообщений. Хороший мультфильм тоже :) – 2013-03-30 16:24:55

0

Входной фильтр обычно делается на уровне языка, а не слои базы данных.
У php и .NET есть свои библиотеки для экранирования операторов sql. Проверьте свой язык, см. Waht.
Если ваши данные являются надежными, вы можете просто заменить строку, чтобы добавить еще один «infront of», чтобы избежать ее. Обычно этого достаточно, если нет никаких опасностей, что ввод вредоносный.

1

Я полагаю, что хороший вопрос - какой язык вы используете?
В PHP вы бы сделали: SELECT * FROM PEOPLE WHERE SURNAME = 'mysql_escape_string (O'Keefe)'
Но так как вы не указали язык, я предлагаю вам изучить функцию escape-последовательности mysql или иначе в вашем язык.

+0

`mysqli_real_escape_string()` для более современного подхода. – Jordan 2017-10-27 15:46:44

1

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

Command = SELECT * FROM PEOPLE WHERE SURNAME=? 

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

  • Струны с цитатами
  • Запросы с использованием даты
  • SQL Injection
1

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

3

Oracle 10 решение

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

Чтобы справиться кавычки, если вы используете 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\'' 
Смежные вопросы