使用MySQL搜索:如何逃避通配符

时间:2011-01-03 21:14:28

标签: mysql search jdbc escaping wildcard

我目前正在使用这样的查询(使用JDBC)搜索我的数据库:

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

现在,这显然非常糟糕,因为它允许SQL注入以及插入通配符,例如%和_。

我的问题是,如何进行查询,即使searchString包含任何这些字符,它们也会被字面上对待?

2 个答案:

答案 0 :(得分:6)

首先,不要将LCASELIKE一起使用,除非您使用区分大小写的区域设置(这不是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 :(得分:1)

根据this,您可以使用斜杠(\)或指定自己的转义字符来转义它们:

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

您必须搜索并替换您的语言(Java?),LIKE%中的mysql _通配符符号,并将其替换为{{1}分别和\%。您上面提到的其他模式匹配不是(根据链接的文档)支持。