MySQL的。如何发送长数据到mysql服务器?

时间:2019-07-10 09:05:36

标签: mysql client

我目前正在开发基于NodeJS的MySQL客户端。拜托,不要问为什么,这只是我做事的方式。

到目前为止,它运行良好,但是我真的对将大量数据发送到准备好的语句的方式感到困惑。

如果我尝试使用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的数据包。服务器不喜欢它,抱怨“ Got数据包乱序”。好吧,然后我尝试对所有数据包使用SID 00,然后服务器将其接收。

但是还有另一个问题。如果我将其作为长数据发送,是否应该将其从执行数据包中排除?还是应该用占位符代替它?从STMT_EXECUTE数据包中排除值后,服务器会抱怨“ mysqld_stmt_execute的参数不正确”。

我试图研究其他一些mysql客户端的源代码,但是没有运气。

例如,官方的nodejs / mysql客户端根本不支持准备好的语句。

有人能以某种方式帮助它吗?

如果能有所帮助,我会在几个小时内尝试上载我的源代码。

1 个答案:

答案 0 :(得分:0)

感觉就像我找到了解决方法……。

所有长数据包发送完后,我应该发送一条执行命令,其中的空值用于必需的参数,而不仅仅是从列表中排除它。它将加入所有先前发送的数据包,并在结果末尾附加空值。

听起来有点迷,但据我所知,它确实有效(尽管尝试了16字节消息,但被5字节分割了)。

这是我当前的解决方案。我已经制作了一个发送长数据的功能,将其拆分为数据包。 https://github.com/MadBrozzeR/mysql/blob/master/operations/sendLongData.js

到目前为止,这感觉是最好的(也是唯一的)解决方案。