每个数据库提供程序类型的最大允许参数数是多少?

时间:2011-07-05 11:00:18

标签: mysql sql-server oracle sqlite postgresql

可以通过ADO.Net传递给Sql Server查询的2,100个参数的限制,但.Net开发人员使用的其他常用数据库的记录限制是什么 - 特别是我对以下内容感兴趣: / p>

  • Oracle 10g / 11g
  • MySQL的
  • 的PostgreSQL
  • SQLite的

有人知道吗?

5 个答案:

答案 0 :(得分:20)

甲骨文:64,000。 Source

MySQL的:

  • 默认情况下,没有限制。 MySQL“文本协议”要求.NET客户端库在将命令文本发送到服务器之前替换所有参数;没有可以强制执行的服务器端限制,客户端没有限制(可用内存除外)。
  • 如果通过调用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反复试验凭经验发现了它们。它们是(没有将它们绑定到特定版本):

  • Ingres:1024
  • Microsoft Access:768
  • Oracle:32767
  • PostgreSQL:32767
  • SQLite:999
  • SQL Server:2100(取决于版本)
  • Sybase ASE:2000

其他数据库似乎没有任何限制-至少我们还没有发现它们(不过看起来还远没有超过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万个参数。这还需要一个额外的客户端功能标志。

总结:

  • 客户端/服务器协议文档似乎表明参数的最大数量为32768
  • 服务器似乎并不在乎您是否发送更多邮件,但这似乎没有记录在案,并且将来的发行版中可能不支持该服务器。我非常怀疑这是否会发生,因为这会破坏包括Oracle自己的ADO.NET连接器在内的多个驱动程序。