1

执行多插入查询时,我收到错误“SQLSTATE [08S01]:通信链路故障:1153 获得的数据包大于 'max_allowed_pa​​cket' 字节”。我有一个复杂的类,它组成了多插入查询,彻底检查了限制,所以这真的很奇怪,但是,我们都是人类,所以在尝试找到问题后,我刚刚捕获并记录了异常详细信息并且可以不明白发生了什么。代码(PHP 7.4、PDO、MariaDB 10.5.10):

        $this->pdoInstance = sql_get_connect($this->connection);

        $stmt = $this->pdoInstance->query("show variables like 'max_allowed_packet'");
        $d = sql_fetch($stmt);
        $stmt->closeCursor();
        $this->max_size = (int) $d['Value'];
...
        try {
            $stmt = $this->pdoInstance->query($query);
        } catch (CDbException $e) {
            if (strpos($e->getMessage(), 'max_allowed_packet') !== false) {
                log ([
                    'total_size' => strlen($query),
                    'max_size' => $this->max_size,
                ];
            }
            throw $e;
        }

我得到的是:

total_size => 33554425
max_size => 33554432

所以我发送的查询实际上比限制少了 7 个字节。但是问题被稳定地重现了。是什么原因造成的?可能有一些标题与查询或任何东西一起发送,但我如何确定它们的大小?我在 MySQL 和 MariaDB 文档中都没有找到任何关于它的信息。

4

2 回答 2

2

strlen()没有正确处理多字节字符,因为它假定 1 个字符等于 1 个字节,这对 unicode 根本无效。

尝试改用mb_strlen()函数(mb 代表多字节)。

于 2021-09-22T18:22:18.723 回答
0

嗯,这个问题看起来很简单。我们的应用服务器上安装了一个 PHP 扩展,它会干扰 PDO 查询的执行,并在那里添加特殊注释。它是复杂入侵检测系统或类似系统的一部分,但从未记录过它会影响查询长度;现在我知道了。

很抱歉打扰,感谢大家的帮助!

于 2021-09-23T08:05:16.223 回答