SQLSTATE[HY000]:一般错误:1835 LARAVEL 上的格式错误的通信数据包

wbh*_*ana 48 mysql mariadb laravel mariadb-10.3

突然得到

SQLSTATE[HY000]:一般错误:1835 格式错误的通信数据包(SQL:select * from tb_userswhere ( username= 121211) limit 1)

在 Laravel 上。

我已经检查过这个:MySQL: ERROR 2027 (HY000): Malformed packet,但似乎是另一种情况。

  1. 之前使用 SSH(使用:mysql -u -p)登录后,我已成功登录到 MySQL。
  2. 我已经成功地直接从远程 PC 登录到 MySQL(使用:mysql -h [IP] -u -p)。

但是我的 Laravel 出现了我之前提到的错误。有这方面的经验吗?

小智 39

我所有运行 PHP 7.2 的 Laravel 应用程序都有这个错误,但那些运行在 PHP 7.3 上的应用程序没有。于是我把PHP版本改成了7.3,问题就解决了。(运行 Laravel 7)


wbh*_*ana 27

找到了解决办法。不知道是永久的还是暂时的:

'mysql' => [
            'driver' => 'mysql',
            'host' => env('DB_HOST', '127.0.0.1'),
            'port' => env('DB_PORT', '3306'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
            'unix_socket' => env('DB_SOCKET', ''),
            'charset' => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix' => '',
            'strict' => false,
            'engine' => null,
            **'options'   => [PDO::ATTR_EMULATE_PREPARES => true]**
        ],
Run Code Online (Sandbox Code Playgroud)

确保

'选项' => [PDO::ATTR_EMULATE_PREPARES => 真]

存在于 mysql 连接上。

  • 此解决方法是将响应中的整数更改为字符串。这会导致严格条件 `===` 由于类型不匹配而失败。 (15认同)
  • 上游 [MariaDB JIRA 问题 MDEV-24121](https://jira.mariadb.org/browse/MDEV-24121) 感谢 cpanel 人员。 (4认同)
  • 这不是一个解决方案,也不是一个解释,而是一种解决方法,其含义在您的答案中未提及。 (3认同)
  • 这个解决方案打破了一切。我不推荐它。问题是 MariaDB 更新破坏了一些东西,需要降级。请参阅 incogzito 的评论。 (3认同)

Nee*_*eel 18

在将 MariaDB 更新到 v10.3.26(和 10.2.35)之后,昨天最近的 MariaDB 更新后,这个问题开始发生在很多人身上。此问题已在此处解决:https : //jira.mariadb.org/browse/MDEV-24121

截至目前,这些是唯一已知的解决方案:

1. 将您的 PHP 升级到 7.3:这些错误似乎显示在使用 php < 7.3 的站点上。因此,将您网站的 PHP 升级到 7.3 或 7.4 版应该可以解决该问题。

缺点:并不是很多应用程序都可以像那样轻松升级到 php 7.3。有时您可能需要更新您的平台,重写一些代码或检查所有依赖项,看看它们是否都适用于 7.3。对于许多成熟的应用程序,这可能不是一个快速解决方案。

2. 降级 MariaDB:这是一个临时修复,因为降级 MariaDB 会将其设置回之前的状态。

缺点:通过单击 cpanel 中的按钮来降级 MariaDB 并不是一件容易的事情。您可能需要网络工程师的帮助来为您进行降级。之后,您可能还需要对 MariaDB 软件包进行 yum 锁定,以避免在修补之前对其进行更新。

3. 添加'options' => [PDO::ATTR_EMULATE_PREPARES => true]到数据库配置:这已在一些答案中提出,这可能会解决 1 个问题,但会引发许多其他问题。

缺点:将上述内容添加到数据库配置文件为我解决了 1 个问题,但它也打开了很多其他失败的查询,数据库插入失败等。所以我根本不推荐这个修复。

4. 等待 MariaDB 更新:下一次更新应该会解决这个问题。

缺点:我们不知道需要多长时间才能获得针对旧版 PHP 修复此问题的更新。甚至可能需要几天时间,某些应用程序可能无法等待那么长时间。

总而言之,这些是我目前能看到的唯一选择。只希望尽快修复它。

短期修复:总之,考虑到我的应用程序需要大量工作才能为 php 7.3 做好准备,降级 MariaDB 对我来说似乎是唯一简单(差不多)的临时修复。我将 MariaDB 降级到 10.2.34 并锁定它,错误不再出现。

长期修复:最好最终让您的应用程序为 php 7.3 做好准备并升级到 php 7.3,这样 MariaDB 新版本也不会抱怨。

  • [MariaDB 10.5.8、10.4.17、10.3.27 和 10.2.36 紧急版本现已推出](https://mariadb.org/mariadb-10-5-8-10-4-17-10- 3-27-and-10-2-36-now-available/) 纠正了这个问题。 (2认同)

inc*_*ito 8

mariadb 一夜之间更新后也遇到了这个问题。降级 mariadb 为我解决了这个问题。

https://support.cpanel.net/hc/en-us/articles/360056772334

  • 这不是最好的解决方案,因为降级会带来一些在升级中修复的故障或安全增强功能:) 更好的方法是将 PHP 升级到 PHP7.3 :-) (3认同)
  • @JossBird 这应该会降级。`yum 降级 MariaDB-服务器 MariaDB-common MariaDB-共享 MariaDB-客户端 MariaDB-compat MariaDB-devel`。不过,我建议在降级之前备份所有内容。 (2认同)