针对通过ADO.Net传递给Sql Server查询的参数,有一个2100个参数的限制。但其他常用的数据库(特别是我感兴趣的Oracle 10g/11g、MySQL、PostgreSQL和SQLite)的文档限制是什么呢?
- Oracle 10g/11g
- MySql
- PostgreSql
- Sqlite
有人知道吗?
针对通过ADO.Net传递给Sql Server查询的参数,有一个2100个参数的限制。但其他常用的数据库(特别是我感兴趣的Oracle 10g/11g、MySQL、PostgreSQL和SQLite)的文档限制是什么呢?
有人知道吗?
Oracle: 64,000. 来源
MySQL:
MySqlCommand.Prepare()
并在连接字符串中指定IgnorePrepare=false
来使用“准备语句”,则有65,535个参数的限制(因为num_params
必须适合于两个字节)。PostgreSql:编辑:根据Magnus Hagander的答案,查询限制为34464,函数限制为100(此处复制答案以提供单个参考点)
SqlLite:999(SQLITE_MAX_VARIABLE_NUMBER,默认为999,但可以在运行时降低)- 对于函数,默认参数为100。 请参阅运行时限制文档的第9部分
其他数据库似乎没有任何限制-至少我们尚未发现它们(虽然还没有远超过100000)。
SELECT * FROM t WHERE x IN (?, ?, ..., ?)
。但是当达到限制(或客户端代码明确请求)时,生成的SQL将包含“内联”值,例如 SELECT * FROM t WHERE x IN (1, 2, ..., 53675)
。 - Lukas EderIN
列表中元素数量的限制。jOOQ通过使用“OR”谓词来分割IN
列表来处理此限制。这个限制与是否使用绑定变量无关。 - Lukas EderPostgreSQL的网络协议在绑定消息中使用16位整数来计算参数数量 (https://www.postgresql.org/docs/current/protocol-message-formats.html)。
因此,对于单个语句,PostgreSQL协议不允许超过65535个参数。这意味着可以发送一个包含两个语句的ADO.NET命令,每个语句都有65535个参数。
对于关于查询的边界参数,PostgreSQL 的正确答案似乎是 34464。而对于函数的参数数量,响应为 100 仍然是正确的。
不过,如果您发送的参数数量超过此数字,COM_STMT_PREPARE
实际上并不会返回错误。实际上,num_params
的值只是2^16,并且之后会有更多的参数。我不确定这是否是一个错误,但协议文档没有描述这种行为。
只要您在客户端有一种方法知道参数的数量(如果您愿意,可以使用client_num_params
),您可以以这样的方式实现MySQL客户端,即它希望看到client_num_params
x Protocol::ColumnDefinition
。您还可以观察EOF_Packet
,但只有在未启用CLIENT_DEPRECATE_EOF
时才会实际发送该数据包。
值得注意的是,在num_params
之后还有一个保留字节,表明协议设计者可能希望将其作为一个24位数字的选项,从而允许约830万个参数。这也需要额外的客户端能力标志。
总结:
MySqlCommand
添加了100,000个参数,因此限制大于65,536。请注意,MySqlCommand.Parameters.Add
方法使用O(n)算法(截至v6.5.4),因此添加100,000个参数确实需要近两分钟(添加_n_个参数总体上是O(n^2))。 - Bradley Grainger