Каково максимальное количество допустимых параметров для каждого типа поставщика базы данных? - PullRequest
17 голосов
/ 05 июля 2011

Существует ограничение в 2100 параметров, которые могут быть переданы запросу Sql Server, например, через ADO.Net, но каковы документированные ограничения для других общих баз данных, используемых разработчиками .Net - в частности, меня интересует:

  • Oracle 10 г / 11 г
  • MySql
  • PostgreSql
  • Sqlite

Кто-нибудь знает?

Ответы [ 5 ]

20 голосов
/ 05 июля 2011

Оракул: 64 000. Источник

MySQL:

  • По умолчанию ограничения отсутствуют. «Текстовый протокол» MySQL требует, чтобы клиентская библиотека .NET заменяла все параметры перед отправкой текста команды на сервер; нет ограничения на стороне сервера, которое может быть применено, и у клиента нет ограничения (кроме доступной памяти).
  • Если использовать «подготовленные операторы», вызывая MySqlCommand.Prepare() (и указав IgnorePrepare=false в строке подключения), тогда существует ограничение в 65 535 параметров (поскольку num_params должно вписываться в два байта ).

PostgreSql: РЕДАКТИРОВАТЬ: 34464 для запроса и 100 для функции согласно ответу Магнуса Хагандера (ответ скопирован здесь, чтобы обеспечить единую точку отсчета)

SqlLite: 999 (SQLITE_MAX_VARIABLE_NUMBER, который по умолчанию равен 999, но может быть уменьшен во время выполнения) - И для функций по умолчанию установлено 100 параметров. См. Раздел 9 документации по временным рамкам

6 голосов
/ 05 июля 2011

Правильный ответ для PostgreSQL представляется 34464, когда речь идет о связанных параметрах для запроса. Ответ 100 по-прежнему правильный для количества параметров функции.

2 голосов
/ 11 января 2019

В jOOQ мы обошли эти ограничения, добавив значения привязки, как только мы достигнем соответствующего числа для каждого поставщика. Номера документированы здесь . Не все числа обязательно являются правильными в соответствии с документацией поставщика, мы обнаружили их опытным путем методом проб и ошибок через JDBC. Они (без привязки их к конкретной версии):

  • Ingres: 1024
  • Microsoft Access: 768
  • Oracle: 32767
  • PostgreSQL: 32767
  • SQLite: 999
  • SQL Server: 2100 (в зависимости от версии)
  • Sybase ASE: 2000

Другие базы данных, похоже, не имеют каких-либо ограничений - по крайней мере, мы их еще не обнаружили (хотя не смотрели далеко за пределы 100000).

1 голос
/ 20 марта 2018

Проводной протокол PostgreSQL использует 16-разрядные целые числа для подсчета параметров в сообщении связывания (http://www.postgresql.org/docs/9.4/static/protocol-message-formats.html).

Таким образом, протокол PostgreSQL не допускает более 65535 параметров для одного оператора.ОК, чтобы отправить одну команду ado.net с двумя операторами, каждый из которых имеет 65535 параметров.

0 голосов
/ 25 мая 2019

На мой взгляд, вопрос MySQL имеет два ответа.Подготовленный протокол оператора определяет 2-байтовое короткое число со знаком для описания количества параметров, которые будут получены с сервера.Сначала клиент вызывает COM_STMT_PREPARE , для которого он получает COM_STMT_PREPARE ответ в случае успеха.

Документация для состояний ответа:

Если num_params> 0, последуют еще 0 пакетов:

Блок определения параметров

  • num_params * Protocol::ColumnDefinition

  • EOF_Packet

Учитывая, что num_params может быть максимум 2 ^ 16 (подписанный шорт), из этого следует, что это предел параметров и как моя компанияимеет собственный драйвер MySQL, который мы выбрали, чтобы следовать этому правилу при его реализации, и возникает исключение, если превышен предел.

Однако 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-битное число, что позволяет около 8,3 миллиона параметров.Для этого также потребуется дополнительный флаг возможностей клиента.

Подводя итог:

  • Документация по протоколу клиент / сервер, по-видимому, указывает, что максимальное количество параметров может быть 32768
  • Сервер, похоже, не заботится, отправляете ли вы больше, но это не документировано и может не поддерживаться в будущих выпусках.Я очень сомневаюсь, что это произойдет, потому что это сломает несколько драйверов, включая собственный ADO.NET Connector от Oracle.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...