Сведения о вопросе

Gaukhar

14:30, 9th August, 2020

Теги

sql   oracle    

Как мне работать с котировками ' в SQL

Просмотров: 442   Ответов: 8

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

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

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

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



  Сведения об ответе

lats

01:39, 2nd August, 2020

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

Например,

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 .

alt text


  Сведения об ответе

screen

21:06, 1st October, 2020

Oracle 10 Решение

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


  Сведения об ответе

#hash

07:30, 2nd August, 2020

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

Command = SELECT * FROM PEOPLE WHERE SURNAME=?

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

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


  Сведения об ответе

#hash

21:06, 1st October, 2020

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


  Сведения об ответе

baggs

00:49, 1st August, 2020

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


  Сведения об ответе

PIRLO

08:58, 19th August, 2020

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


  Сведения об ответе

ASSembler

01:20, 5th August, 2020

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


  Сведения об ответе

KOMP

21:18, 9th August, 2020

Найдено в 30-х годах прошлого века в Google...

Oracle SQL чаво


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться