В настоящее время я разрабатываю мой 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 вообще не поддерживает подготовленные операторы.
Может кто-нибудь помочь с этим как-нибудь?
Через несколько часов я попытаюсь загрузить свой исходный код, если это будет иметь значение.