如何在与PDO和预准备语句一起使用时确定所需的max_allowed_pa​​cket大小?

时间:2016-12-13 16:16:30

标签: mysql pdo prepared-statement

或者通过示例,max_allowed_packet需要执行以下查询?请不要只给我价值,但要解释你是如何决定的。谢谢

$stmt=$pdo->prepare('INSERT INTO t(c1,c2,c3) VALUES(?,?,?)');
$stmt->execute([9876543210,9876543210,9876543210]);

EDIT。或者这个怎​​么样:

$sql='INSERT INTO t(pk,c1,c2) VALUES(?,?,?), (?,?,?), (?,?,?)
ON DUPLICATE KEY UPDATE c1=VALUES(c1),c2=VALUES(c2)';
$stmt=$pdo->prepare($sql);
$stmt->execute([1,111,111,2,222,222,3,333,333]);

1 个答案:

答案 0 :(得分:1)

要计算max_allowed_packet大小,请取最大blob列的字节长度并乘以11。有关详细信息,请see this post.

在您的示例中,虽然您有一个冗长的查询而不是大量的blob数据。根据我的经验,乘以11指南仍然可行,但它不是调整价值的最佳方式。

如上所述,证据是调整此值的最佳方法。我会将max_allowed_packet设置为任意巨大的值,例如1G。 (我相信MySQL支持的最大值。)然后,在正常操作中运行您的软件。如果您没有收到PACKET_TOO_LARGE错误,请将值减半,然后重试。重复,直到你溢出限制然后加倍。这将代表您特定需求的合理上限,并有足够的增长空间。