如何在GORM中转义LIKE查询含通配符的用户输入参数?
GORM处理LIKE查询中的通配符转义问题
当用户输入的内容包含%、_这类LIKE查询的通配符时,直接拼接会导致不符合预期的匹配,以下是两种可靠的解决方案:
1. 手动转义用户输入后拼接通配符
先对用户输入的字符串做转义处理,将%替换为\%,_替换为\_(注意不同数据库的转义符可能有差异,比如MySQL默认用\,PostgreSQL可通过ESCAPE指定),再拼接%作为查询条件。
示例代码:
import "strings" // 定义转义函数 func escapeLikeValue(value string) string { value = strings.ReplaceAll(value, "%", "\\%") value = strings.ReplaceAll(value, "_", "\\_") return value } // 实际使用 userInput := "jin%" // 用户输入包含通配符% escapedInput := escapeLikeValue(userInput) db.Where("name LIKE ?", "%"+escapedInput+"%").Find(&users) // 最终生成SQL:SELECT * FROM users WHERE name LIKE '%jin\%';
2. 结合数据库特性或GORM Expr构建安全条件
- 针对MySQL,可通过
ESCAPE关键字明确指定转义符,增强兼容性:
userInput := "jin%" escapedInput := strings.ReplaceAll(strings.ReplaceAll(userInput, "%", "\\%"), "_", "\\_") db.Where("name LIKE ? ESCAPE '\\'", "%"+escapedInput+"%").Find(&users)
- 也可使用GORM的
Expr方法构建条件,逻辑更清晰:
userInput := "jin%" escapedInput := escapeLikeValue(userInput) db.Where(gorm.Expr("name LIKE ?", "%"+escapedInput+"%")).Find(&users)
错误写法说明
你之前尝试的两种写法都存在问题:
db.Where("name LIKE %?%", "jin"):属于语法错误,%?%不是合法的参数占位符格式,会导致SQL解析失败。db.Where("name LIKE '%' || ? || '%'", "jin"):仅做字符串拼接,不会自动转义参数中的通配符,若用户输入包含%,会被当作查询通配符而非普通字符处理。
内容的提问来源于stack exchange,提问作者Julian Popov
相关产品推荐
相关产品推荐

