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

Dan*_*bbs 2 mysql search escaping jdbc wildcard

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

"... AND LCASE(Items.Name) LIKE '%" + searchString.toLowerCase() + "%';"
Run Code Online (Sandbox Code Playgroud)

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

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

irc*_*ell 7

首先,除非您使用区分大小写的区域设置(这不是MySQL的默认设置)LCASE,LIKE否则请勿使用.

至于转义那些字符,只需在它们前面添加一个\字符,就这样foo%bar变成了foo\%bar.

(自从我使用Java以来​​已经有一段时间了,但这可能会有效:)

searchString.replaceAll('%', '\\\\%').replaceAll('_', '\\\\_')
Run Code Online (Sandbox Code Playgroud)

(或使用正则表达式):

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

至于阻止SQL注入,只需正常绑定变量:

WHERE LCASE(Items.Name) LIKE ?
Run Code Online (Sandbox Code Playgroud)

并创建绑定字符串,如:

'%' + searchString.replaceAll('%', '\\\\%').replaceAll('_', '\\\\_') + '%'
Run Code Online (Sandbox Code Playgroud)