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