mysql - Go-MySQL-驱动程序 : Prepared Statements with Variable Query Parameters

标签 mysql rest http go

我想在我的 Go 服务器上对 MySQL 使用准备好的语句,但我不确定如何让它使用未知数量的参数。一个端点允许用户发送一组 ID,Go 将从数据库中选择与给定 ID 匹配的对象。这个数组可以包含 1 到 20 个 id,那么我将如何构造一个准备好的语句来处理它?我见过的所有示例都要求您确切知道查询参数的数量。

我能想到的唯一(不太可能)的选择是准备 20 个不同的 SELECT 语句,并使用与用户提交的 ID 数量相匹配的语句——但这似乎是一个糟糕的 hack。到那时我还能看到准备好的语句的性能优势吗?

我很困在这里,所以任何帮助将不胜感激!

最佳答案

据我所知,没有 RDBMS 能够绑定(bind)未知数量的参数。永远不可能匹配具有未知数量参数占位符的数组。这意味着没有聪明的方法将数组绑定(bind)到查询,例如:

SELECT xxx FROM xxx WHERE xxx in (?,...,?)

这不是客户端驱动程序的限制,只是数据库服务器不支持。

有多种解决方法。

您可以使用 20 ? 创建查询,绑定(bind)您拥有的值,并通过 NULL 值完成绑定(bind)。它工作正常,因为涉及 NULL 值的比较操作的特殊语义。像“field = ?”这样的条件当参数绑定(bind)到 NULL 值时,计算结果始终为 false,即使某些行会匹配。假设数组中有 5 个值,数据库服务器将不得不处理 5 个提供的值,外加 15 个 NULL 值。它通常足够聪明,可以忽略 NULL 值

另一种解决方案是准备所有查询(每个查询具有不同数量的参数)。只有在参数的最大数量受到限制时才有意义。它适用于准备好的语句真正重要的数据库(例如 Oracle)。

就 MySQL 而言,使用准备好的语句的好处非常有限。请记住,准备好的语句仅在每个 session 中维护,它们不会在 session 之间共享。如果你有很多 session ,它们会占用内存。另一方面,使用 MySQL 解析语句并不涉及太多开销(与其他一些数据库系统相反)。通常,生成大量准备好的语句来覆盖单个查询是不值得的。

请注意,一些 MySQL 驱动程序提供了准备好的语句接口(interface),但它们在内部不使用 MySQL 协议(protocol)的准备语句功能(同样,因为通常不值得这样做)。

还有一些其他解决方案(例如依赖临时表),但只有在参数数量很大时它们才有意义。

关于mysql - Go-MySQL-驱动程序 : Prepared Statements with Variable Query Parameters,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30043912/

相关文章:

MySQL 错误 1215 : Cannot add foreign key constraint

javascript - CanvasJs 动态数据与 PHP、mySQL

mysql - SQL首先用数字某种模式对字符串进行排序

json - 何时应在 REST API 响应中忽略 null 属性?

c - 在 Gsoap 中添加来自 header 字段的 HTTP POST header

php - CSV导入功能在插入mysql数据库时添加前面的双引号

java - JPA - 从 REST 服务获取子对象

web-services - com.sun.jersey.api.container.ContainerException : The ResourceConfig instance does not contain any root resource classes

python - MITMProxy 性能不佳

sockets - 非常偶发的 Go HTTP 错误 : multiple response. WriteHeader 调用