我想在我的 Go 服务器上对 MySQL 使用准备好的语句,但我不确定如何使它与未知数量的参数一起工作。一个端点允许用户发送一组 id,Go 将从数据库中选择与给定 id 匹配的对象。这个数组可以包含 1 到 20 个 ID,那么我将如何构造一个准备好的语句来处理它呢?我见过的所有示例都要求您确切知道查询参数的数量。我能想到的唯一(非常不可能的)选项是准备 20 个不同的 SELECT 语句,并使用与用户提交的 id 数量相匹配的语句 - 但这似乎是一个可怕的黑客攻击。我什至会在那时看到准备好的语句的性能优势吗?我被困在这里,所以任何帮助将不胜感激!
1 回答
互换的青春
TA贡献1797条经验 获得超6个赞
我知道没有 RDBMS 能够绑定未知数量的参数。永远不可能匹配具有未知数量的参数占位符的数组。这意味着没有将数组绑定到查询的智能方法,例如:
SELECT xxx FROM xxx WHERE xxx in (?,...,?)
这不是客户端驱动程序的限制,数据库服务器根本不支持这一点。
有各种解决方法。
您可以使用 20 ? 创建查询,绑定您拥有的值,并通过 NULL 值完成绑定。它工作正常,因为涉及 NULL 值的比较操作的特定语义。像“field = ?”这样的条件 当参数绑定到 NULL 值时,计算结果始终为 false,即使某些行匹配。假设您的数组中有 5 个值,数据库服务器将必须处理 5 个提供的值,以及 15 个 NULL 值。忽略 NULL 值通常足够聪明
另一种解决方案是准备所有查询(每个查询具有不同数量的参数)。只有在参数的最大数量受到限制时才有趣。它适用于准备好的语句真正重要的数据库(例如 Oracle)。
就 MySQL 而言,使用准备好的语句的收益非常有限。请记住,准备好的语句仅在每个会话中维护,它们不会跨会话共享。如果你有很多会话,它们会占用内存。另一方面,使用 MySQL 解析语句不会涉及太多开销(与其他一些数据库系统相反)。通常,生成大量准备好的语句来覆盖单个查询是不值得的。
请注意,一些 MySQL 驱动程序提供了准备好的语句接口,而它们在内部不使用 MySQL 协议的准备好的语句功能(同样,因为通常不值得)。
还有一些其他解决方案(例如依赖临时表),但只有在参数数量很大时它们才有意义。
- 1 回答
- 0 关注
- 257 浏览
添加回答
举报
0/150
提交
取消