【问题标题】:How calculate the size of a MySQL statement (not the query results)如何计算 MySQL 语句的大小(不是查询结果)
【发布时间】:2018-05-30 03:37:48
【问题描述】:

我正在开发一个针对 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 字符串中使用的字节相加?或者是其他东西?我不太确定数据库驱动程序是如何工作的,所以如果你对它们有所了解的话,也许一些相关的上下文会有所帮助。

【问题讨论】:

  • 出于好奇,为什么要限制插入语句的大小?
  • 我已经多次遇到 max_packet_allowed 限制,我不想仅仅针对应用程序中的某些边缘情况更改该设置。

标签: mysql database-connection max-allowed-packet


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

    如果提供了更多参考来纠正信息,我非常乐意编辑此答案。如果我偏离了基地,我很乐意删除答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-29
      • 1970-01-01
      • 1970-01-01
      • 2013-08-13
      • 1970-01-01
      • 2016-04-05
      相关资源
      最近更新 更多