可以通过ADO.Net传递给Sql Server查询的2,100个参数的限制,但.Net开发人员使用的其他常用数据库的记录限制是什么 - 特别是我对以下内容感兴趣: / p>
有人知道吗?
答案 0 :(得分:20)
MySQL的:
MySqlCommand.Prepare()
(并在连接字符串中指定IgnorePrepare=false
)来使用“预备语句”,那么参数限制为65,535(因为num_params
必须适合{ {3}})。PostgreSql:编辑:34464用于查询,100用于函数,按照Magnus Hagander的答案(答案复制在这里以提供单一参考点)
SqlLite:999(SQLITE_MAX_VARIABLE_NUMBER,默认为999,但可以在运行时降低) - 对于函数,默认值为100个参数。 two bytes
答案 1 :(得分:6)
在讨论查询的绑定参数时,PostgreSQL的正确答案似乎是34464。响应100对于函数的参数数量仍然是正确的。
答案 2 :(得分:2)
在jOOQ中,一旦达到每个供应商的相关数量,我们便通过内联绑定值来解决这些限制。 The numbers are documented here。根据供应商的文档,并非所有数字都一定是正确的数字,我们已经通过JDBC反复试验凭经验发现了它们。它们是(没有将它们绑定到特定版本):
其他数据库似乎没有任何限制-至少我们还没有发现它们(不过看起来还远没有超过100000)。
答案 3 :(得分:1)
PostgreSQL有线协议使用16位整数来计算绑定消息中的参数计数(http://www.postgresql.org/docs/9.4/static/protocol-message-formats.html)。
因此,PostgreSQL协议不允许单个语句超过65535个参数。这样就可以发送一个带有两个语句的ado.net命令,每个语句都有65535个参数。
答案 4 :(得分:0)
在我看来,MySQL问题实际上有两个答案。准备好的语句协议定义了一个带符号的2字节短,以描述将从服务器检索的参数数量。客户端首先呼叫COM_STMT_PREPARE,如果成功,客户端会收到COM_STMT_PREPARE response。
响应文档说明:
如果num_params> 0,则会再发送以下数据包:
参数定义块
num_params
*Protocol::ColumnDefinition
EOF_Packet
鉴于num_params
最多只能为2 ^ 16(带符号的短整数),因此这是参数的限制,并且由于我公司有自定义的MySQL驱动程序,因此我们选择在以下情况下遵循此规则实现它,如果超出限制,则会引发异常。
但是,如果您发送的参数数量超过此数量,COM_STMT_PREPARE
实际上不会返回错误。 num_params
的值实际上仅为2 ^ 16,之后将包含更多参数。我不确定这是否是一个错误,但是协议文档没有描述这种行为。
只要您有一种方法可以知道参数的数量(如果可以的话,client_num_params
),就可以以希望看到{{1 }} x client_num_params
。您还可以注意Protocol::ColumnDefinition
,但这仅在未启用EOF_Packet
的情况下才发送。
有趣的是,在CLIENT_DEPRECATE_EOF
之后有一个保留字节,表明协议设计者可能希望将该选项设置为24位数字,允许大约830万个参数。这还需要一个额外的客户端功能标志。
总结: