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
相关产品推荐
相关产品推荐

