Во-первых, не используйте 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('_', '\\\\_') + '%'