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

Go SQL预处理语句LIKE查询如何正确转义%通配符

报错原因

你写的'%?%'中,?被单引号包裹,属于SQL字符串字面量的一部分,Go的SQL驱动无法识别到这是参数占位符,因此预处理阶段判定该SQL不需要传入任何参数,后续调用Query传入1个参数时就会触发sql: expected 0 arguments, got 1错误。

你提到的能正常运行的写法LIKE ?里,?是独立的占位符,能被驱动正确识别,但这种写法是精确匹配,达不到模糊查询的效果。

正确实现参数化模糊查询

核心原则:%是LIKE查询的值内容的一部分,不属于SQL语句结构,不要把%写在SQL语句的占位符附近,要将%拼接在你传入的参数值上。

基础实现代码如下:

// 预处理语句仅保留独立的?占位符,不要额外加引号、通配符
stmt, err := DBCon.Prepare("SELECT * FROM item WHERE market_hash_name LIKE ?")
handle_error(err)

// 将通配符拼接到待查询的参数值上,再传入Query
queryKey := "%" + market_hash_name + "%"
res, err := stmt.Query(queryKey)
handle_error(err)

特殊字符转义处理

如果你的查询关键词本身可能包含%、_这类LIKE语法里的特殊通配符,且你不希望这些字符被当作通配符使用(比如要查名称里本身带%的商品),需要先对参数里的特殊字符做转义:

// 先替换参数里自带的特殊通配符,注意转义符根据你使用的数据库调整,以下示例适配MySQL
replacer := strings.NewReplacer(
	"%", "\\%",
	"_", "\\_",
)
queryKey := "%" + replacer.Replace(market_hash_name) + "%"

// 可以显式指定ESCAPE标记,避免不同数据库默认转义符差异带来的问题
stmt, err := DBCon.Prepare("SELECT * FROM item WHERE market_hash_name LIKE ? ESCAPE '\\'")
handle_error(err)
res, err := stmt.Query(queryKey)
handle_error(err)
注意事项
  • 绝对不要直接把用户输入拼接进SQL字符串,会直接引发SQL注入风险,所有动态查询值必须通过?占位符传入
  • 不要为了省事把通配符直接写在SQL语句里包裹占位符,会导致驱动无法识别占位符
  • 涉及用户输入的模糊查询,建议默认转义参数里自带的%、_字符,避免出现不符合预期的匹配结果

内容的提问来源于stack exchange,提问作者codedor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 01:21:20