You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 02:55:26