GORM文档中有一个如何使用LIKE条件的示例:
// LIKE
db.Where("name LIKE ?", "%jin%").Find(&users)
// SELECT * FROM users WHERE name LIKE '%jin%';
这种方法的问题是,如果jin
是用户输入变量,它可以包含像%
这样的通配符。我如何逃脱这种通配符?
对我来说,这些符号必须用在左边,比如:
db.Where("name LIKE %?%", "jin").Find(&users)
或
db.Where("name LIKE '%' || ? || '%'", "jin").Find(&users)
ORM应该自动转义参数,但它的行为并非如此。
什么是正确的解决方案?
尝试显式替换通配符:
db.Where("name LIKE '%' || replace(replace(?, '%', '%), '_', '_') || '%'", "jin").Find(&users)
显式转义。
db.Where("name like '%'||?||'%' escape ''", userinput)
并且在传递到CCD_ 3之前预先转义用户输入中的通配符符号。用户输入中的反斜线也应加倍。
无关,但我更喜欢正则表达式~
和~*
运算符,而不是like
。