2

我正在开发一种针对 MySQL 数据库生成和运行 SQL 的工具。我正在尝试添加基于用户指定设置限制插入语句大小的功能。我找到了一些关于max_allowed_packet设置的信息,但我没有找到任何解释如何计算数据包大小的信息。MySQL 文档说“通信数据包是发送到 MySQL 服务器的单个 SQL 语句”,但我不明白 SQL 语句的大小是如何确定的。

我将一条 SQL 语句和一些参数传递给我的驱动程序:

cmd.CommandText= "INSERT INTO myTable VALUES(@int, @date, @text)";
cmd.Parameters.AddWithValue("@int", 1);
cmd.Parameters.AddWithValue("@date", DateTime.Now);
cmd.Parameters.AddWithValue("@text", "how big is this???");
cmd.ExecuteNonQuery();

数据包的大小是否只是所有变量和 SQL 语句的字符串表示中使用的字节的总和?或者我应该根据它们在数据库中占用的空间来计算每个参数的大小,并将其与 SQL 字符串中使用的字节相加?或者是其他东西?我不太确定数据库驱动程序是如何工作的,所以如果你对它们有所了解的话,也许一些关于它的上下文会有所帮助。

4

2 回答 2

2

事实证明,max_allowed_pa​​cket 与以 ASCII 编码通过线路发送的结果查询的大小进行了比较。我只是将参数值替换为 SQL 语句而不是参数名称,并获取结果字符串的大小。字节数是对 MySQL 是否会拒绝该语句的即时预测,因此我可以根据该数字确定何时启动新语句。

于 2018-01-25T21:42:13.677 回答
0

我对 MySql max_packet_allowed 中定义的数据包大小的理解来自文档。我花了一些时间寻找一个明确的答案,但没有任何成功。所以我假设我的答案是正确的,但是 YMMV 并且你可能仍然会遇到问题。

如果您使用大型 BLOB 列或长字符串,则必须增加 [max_packet_allowed] 值。它应该与您要使用的最大 BLOB 一样大。max_allowed_pa​​cket 的协议限制为 1GB。该值应为 1024 的倍数;非倍数向下舍入到最接近的倍数。

上面的引用来自https://dev.mysql.com/doc/refman/5.5/en/server-system-variables.html#sysvar_max_allowed_pa ​​cket 的 v5.5 文档。

从语句“它应该与您要使用的最大 BLOB 一样大”,我推断max_packet_size 是基于列大小,而不是 sql 语句大小。列数据大小将取决于内容和编码。检查您的字符集和排序规则设置,以确定您是使用每个字符 2 字节还是 4 字节。

验证它是语句大小还是列大小的一种简单方法是创建一个包含两个文本列的简单表。假设您的 max_packet_allowed 在客户端和服务器上都是 16M。运行一个插入语句,其中一列是 8M,另一列是 10M(总共 18M)。如果语句无法运行,则为语句大小。如果它没有失败,您可以假设它基于列大小。

当您针对 max_packet_allowed 实施数据包大小检查时,请务必记住服务器和客户端都设置了此值。并且以较低者为准。因为客户可以设置它,所以你不能假设它们总是相同的。

如果提供了更多参考资料以正确信息,我将非常乐意编辑此答案。如果我离基地很远,我会很乐意删除答案。

于 2017-12-17T03:10:10.287 回答