MySQL.Как отправить длинные данные на mysql-сервер? - PullRequest
0 голосов
/ 10 июля 2019

В настоящее время я разрабатываю мой MySQL-клиент на базе NodeJS. Пожалуйста, не спрашивайте почему, просто я так делаю.

Пока это работает довольно хорошо, но я действительно озадачен тем, как отправлять большие объемы данных в подготовленные операторы.

Если я пытаюсь отправить все данные с помощью команды stmt_execute, это, очевидно, говорит о том, что пакет слишком длинный. В документации по протоколу MySQL предлагается использовать COM_STMT_SEND_LONG_DATA для таких случаев, но почти нет информации о том, как правильно его использовать, только описание пакета.

https://dev.mysql.com/doc/internals/en/com-stmt-send-long-data.html

Хотя это пакеты, которые должны быть отправлены до STMT_EXECUTE, я отправляю длинные данные с SID 00, 01, а затем выполняю пакеты с SID 02. Серверу это не нравится, и я жалуюсь на то, что «пакеты вышли из строя». Ну, тогда я попытался использовать SID 00 для всех пакетов, и сервер принял его.

Но есть и другая проблема. Если я отправлю это как длинные данные, я должен исключить это из исполняемого пакета? Или я должен заменить его каким-то заполнителем? После того как значение было исключено из пакета STMT_EXECUTE, сервер жалуется, что «Неверные аргументы для mysqld_stmt_execute».

Я пытался заглянуть в исходный код некоторых других клиентов MySQL, но безуспешно.

Например, официальный клиент nodejs / mysql вообще не поддерживает подготовленные операторы.

Может кто-нибудь помочь с этим как-нибудь?

Через несколько часов я попытаюсь загрузить свой исходный код, если это будет иметь значение.

1 Ответ

0 голосов
/ 11 июля 2019

Такое ощущение, что я нашел решение ... вроде.

После отправки всех длинных пакетов данных я должен отправить команду execute с пустым значением для требуемого параметра, а не просто исключить его из списка. Он объединит все ранее отправленные пакеты и добавит пустое значение в конце результата.

Звучит немного наркоманом, но, насколько я вижу, это работает (хотя и пытался использовать 16-байтовое сообщение, разделенное на 5 байт).

Это мое текущее решение. Я сделал функцию для отправки длинных данных, разбивая их на пакеты. https://github.com/MadBrozzeR/mysql/blob/master/operations/sendLongData.js

Пока что похоже на лучшее (и единственное) решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...