【问题标题】:MySQL. How to send long data to mysql-server?MySQL。如何将长数据发送到mysql-server?
【发布时间】:2019-07-16 17:14:22
【问题描述】:

我目前正在开发基于 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 的数据包。服务器不喜欢它,抱怨“收到的数据包乱序”。好吧,然后我尝试将 SID 00 用于所有数据包,服务器接受它。

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

我尝试查看其他一些 mysql 客户端的源代码,但没有成功。

例如官方的nodejs/mysql客户端,根本不支持prepared statements。

谁能帮忙解决一下?

过几个小时我会尝试上传我的源代码,如果它会有所作为的话。

【问题讨论】:

  • 好吧,max_allowed_pa​​cket 是我没有想到的解决方案之一。但是,协议仍然可以将数据拆分和发送到单独的数据包中。实现它会很棒。
  • dev.mysql.com/doc/refman/8.0/en/server-system-variables.html
  • 所以是的,我可以在我的服务器上增加变量值,或者默认情况下将服务器更新到 8.0.2+ 以获得 64MB,但为什么不灵活呢?只是因为文档不完善?
  • 不,我不是在自言自语。有受访者建议增加@@max_allowed_pa​​cket 设置以允许服务器在一个数据包中接收更多数据。

标签: mysql client


【解决方案1】:

感觉就像我找到了一个解决方案......有点。

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多