Как рассчитать размер оператора MySQL (не результаты запроса)

0

Я работаю над инструментом, который генерирует и запускает SQL для базы данных MySQL. Я пытаюсь добавить возможность ограничить размер инструкции вставки на основе заданного пользователем параметра. Я нашел некоторую информацию о параметре max_allowed_packet, но я не нашел ничего, что объясняет, как рассчитать размер пакета. Документы MySQL говорят, что "Коммуникационный пакет - это один оператор SQL, отправленный на сервер MySQL", но я не понимаю, как определяется размер инструкции SQL.

Я передаю инструкцию SQL и некоторые параметры для моего драйвера:

cmd.CommandText= "INSERT INTO myTable VALUES(@int, @date, @text)";
cmd.Parameters.AddWithValue("@int", 1);
cmd.Parameters.AddWithValue("@date", DateTime.Now);
cmd.Parameters.AddWithValue("@text", "how big is this???");
cmd.ExecuteNonQuery();

Является ли размер пакета просто суммой байтов, используемых в строковом представлении всех переменных и инструкции SQL? Или я должен выяснить размер каждого параметра в зависимости от того, сколько места они будут занимать в базе данных и суммировать с байтами, используемыми в строке SQL? Или что-то другое? Я не совсем уверен, как работают драйверы базы данных, поэтому, возможно, какой-то контекст вокруг этого будет полезен, если вы знаете что-нибудь о них.

Теги:
database-connection

2 ответа

0
Лучший ответ

Оказывается, что max_allowed_packet сравнивается с размером полученного запроса, который был отправлен по проводке в кодировке ASCII. Я просто подставлял значения параметров в оператор SQL вместо имен параметров и принимал размер результирующей строки. Количество байтов было предсказано, будет ли MySQL отклонять оператор, поэтому я мог бы выяснить, когда начинать новый оператор на основе этого числа.

0

Мое понимание размера пакета, как определено в MySql max_packet_allowed, исходит из документации. Я потратил некоторое время на поиск окончательного ответа без каких-либо успехов. Поэтому я предполагаю, что мой ответ правильный, но YMMV, и вы все еще можете столкнуться с проблемами.

Вы должны увеличить значение [max_packet_allowed], если используете большие столбцы BLOB или длинные строки. Он должен быть размером с самый большой BLOB, который вы хотите использовать. Предел протокола для max_allowed_packet составляет 1 ГБ. Значение должно быть кратно 1024; nonmultiples округляются до ближайшего кратного.

Вышеприведенная цитата из документации v5.5 по адресу https://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_max_allowed_packet.

Из утверждения "он должен быть таким же большим, как и самый большой BLOB, который вы хотите использовать", я делаю вывод, что max_packet_size основан на размере столбца, а не на размере оператора sql. Размер данных столбца зависит от содержимого и кодировки. Проверьте свой набор символов и настройки сортировки, чтобы узнать, используете ли вы 2-байтные или 4 байта на символ.

Простой способ проверить, является ли размер оператора или размер столбца, должен иметь простую таблицу с двумя текстовыми столбцами. Предположим, что ваш max_packet_allowed - 16M на клиенте и сервере. Запустите инструкцию insert, где один из столбцов - 8M, а другой столбец - 10M (всего 18M). Если оператор не запускается, это размер оператора. Если это не сработает, вы можете предположить, что оно основано на размере столбца.

Когда вы выполняете проверку размера пакета с помощью max_packet_allowed, важно помнить, что ОБОИХ сервер и клиент имеют это значение. И какой бы ни был ниже реальный максимум. Поскольку клиент может установить его, вы не можете предположить, что они всегда одинаковы.

Я более чем счастлив отредактировать этот ответ, если для исправления информации предоставлены дополнительные ссылки. И если я уйду с базы, я с удовольствием удалю ответ.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню