Как избежать специальных символов в пользовательском вводе для SQL LIKE? - PullRequest
2 голосов
/ 13 апреля 2011

Возьмите следующий пример (SQL Server 2008 - может работать с большим количеством).Вы должны представить себе @query как некоторый параметр, источником которого является пользовательский ввод:

DECLARE @query varchar(100)
SET @query = 'less than 1% fat'

CREATE TABLE X ([A] VARCHAR(100))
INSERT X VALUES ('less than 1% fat')
INSERT X VALUES ('less than 1% of doctors recommend this - it''s full of fat!')
SELECT * FROM X WHERE A LIKE '%' + @query + '%'
DROP TABLE X

В запросе указано 'less than 1% fat', но мы на самом деле получаем больше, чем хотели:

less than 1% fat
less than 1% of doctors recommend this - it's full of fat!

Чтобы получить требуемое поведение, я изменяю @query на 'less than 1[%] fat' - тогда возвращается только первый результат.

Существует ли стандартный способ подготовки строк для предложений, использующих LIKE s, илия должен свернуть свой собственный?

Ответы [ 2 ]

6 голосов
/ 13 апреля 2011

SQL Server позволяет указать escape-символ , затем вы можете просто экранировать строку запроса перед ее использованием.

Пример со страницы MSDN, на которую я ссылался:

SELECT c1 
FROM mytbl2
WHERE c1 LIKE '%10-15!% off%' ESCAPE '!';
6 голосов
/ 13 апреля 2011

Вместо использования LIKE вы можете использовать свободный текстовый поиск и предикаты CONTAINS или FREETEXT . LIKE с лидирующим подстановочным знаком игнорирует индексы и приводит к полному сканированию таблицы, в то время как полнотекстовый поиск использует существующие свободные текстовые индексы для ускорения поиска. Вам придется настроить индексирование свободного текста , прежде чем вы сможете его использовать.

Если вы хотите придерживаться LIKE, лучшим решением будет экранирование строки в вашем клиентском коде. T-SQL предоставляет очень ограниченную функциональность для работы со строками, а функция REPLACE даже не принимает подстановочные знаки. Вы должны будете вложить несколько операторов REPLACE для учета всех подстановочных знаков, используемых LIKE.

Вы можете комбинировать это с предложением ESCAPE и использовать редкий символ, такой как §, ¶ или ¤, в качестве escape-символа, если строка поиска может содержать символы [или].

...