Поиск с использованием MySQL: как избежать подстановочных знаков - PullRequest
1 голос
/ 04 января 2011

В настоящее время я ищу в своей базе данных запрос (использующий JDBC), подобный следующему:

"... AND LCASE(Items.Name) LIKE '%" + searchString.toLowerCase() + "%';"

Теперь, это, очевидно, очень плохо, потому что позволяет вводить SQL, а также вставлять символы подстановкикак% и _.

Мой вопрос: как мне выполнить запрос, чтобы даже если searchString содержал какой-либо из этих символов, они были обработаны буквально?

Ответы [ 2 ]

6 голосов
/ 04 января 2011

Во-первых, не используйте LCASE с LIKE, если вы не используете регистр с учетом регистра (который не используется по умолчанию в MySQL).

Что касается экранирования этих символов, просто добавьте к ним префикс \, поэтому foo%bar становится foo\%bar.

(Прошло много времени с тех пор, как я использовал Java, но возможно это сработает:)

searchString.replaceAll('%', '\\\\%').replaceAll('_', '\\\\_')

(или с использованием регулярных выражений):

Regex r = new Regex('(?:%|_)', '\\\\$&');
r.replaceAll(searchString)

КакЧтобы предотвратить внедрение SQL, просто привяжите переменную как обычно:

WHERE LCASE(Items.Name) LIKE ?

И создайте связанную строку, например:

'%' + searchString.replaceAll('%', '\\\\%').replaceAll('_', '\\\\_') + '%'
1 голос
/ 04 января 2011

В соответствии с этим вы можете избежать их, используя косую черту (\) или указав свой собственный escape-символ:

"... AND LCASE(Items.Name) LIKE '%" + searchString.toLowerCase() + "%' ESCAPE '/';"

Вам нужно будет выполнить поиски замените подстановочные знаки mysql LIKE на вашем языке (Java?), % и _, чтобы заменить их \% и \_ соответственно.Другие шаблоны, которые вы упомянули выше, не поддерживаются (в соответствии со ссылками на документы).

...