【问题标题】:com.mysql.jdbc.PacketTooBigExceptioncom.mysql.jdbc.PacketTooBigException
【发布时间】:2012-07-04 10:26:51
【问题描述】:

我在 MYSQL 中存储图像。

我有桌子

CREATE TABLE myTable (id INT, myImage BLOB);

当我尝试插入 4.7MB 文件时,我收到异常

com.mysql.jdbc.PacketTooBigException: Packet for query is too large (4996552 > 1048576). You can change this value on the server by setting the max_allowed_packet' variable.

我相信这仅与图像大小有关。还有其他我可以使用的变量类型吗?


更新 1

根据较早的 SO 问题,我也尝试使用 MEDIUMBLOB,但仍然遇到相同的错误。

Adding Image to a database in Java


更新 2

在项目开始时,我执行以下查询,现在一切正常

SET GLOBAL max_allowed_packet = 1024*1024*14;

【问题讨论】:

  • 该错误与 MySQL 接收数据时的缓冲区大小有关。该参数的合适大小约为 15M。附言不鼓励将图像存储在数据库中

标签: mysql blob packet


【解决方案1】:

正如错误所说,它与变量类型无关,而是max_allowed_packet 变量:

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

但是,一般来说,不要将文件存储在您的数据库中 - 将它们存储在您的文件系统中并记录数据库中文件的路径。

【讨论】:

  • 我明白,但我的客户想严格存储在 mysql 中:(
  • @FahimParkar:然后增加max_allowed_packet?
  • 只是好奇如何设置max_allowed_packet
  • @FahimParkar:SET GLOBAL max_allowed_packet = .....。如果您希望它在服务器重新启动时保持不变,您可能应该在您的 MySQL 配置文件中设置它。
  • 感谢您的帮助...现在问题解决了...我设置了SET GLOBAL max_allowed_packet = 1024 * 1024 * 14 即 14 MB
【解决方案2】:

以下对我有用

编辑 my.cnf 文件(我的在 /etc/mysql 中)

然后修改max_allowed_pa​​cket值 我把它设置为 max_allowed_pa​​cket=200M

确保您重新启动 MySQL 以使更改生效

【讨论】:

    【解决方案3】:

    对于 Windows 用户:

    mysql_home 指向你的 mysql/mariadb 安装文件夹。

    打开cmd,cd到%mysql_home%\bin并运行mysqladmin > temp.txt这会吐出很多关于该工具使用的信息。在所有输出中的某个地方,您会发现以下信息:

    默认选项按给定顺序从以下文件中读取: C:\windows\my.ini C:\windows\my.cnf C:\my.ini C:\my.cnf c:\mariadb-5.5.29-w inx64\my.ini c:\mariadb-5.5.29-winx64\my.cnf

    这表明您可以在 %mysql_home% 目录中拥有一个名为 my.ini 或 my.conf 的文件(如果您还没有)。

    创建 my.ini 并添加以下行:

    [mysqld]
    #allow larger BLOBs to be stored
    max_allowed_packet = 10M
    

    确保包含设置group,即[mysqld],否则它将无法启动(对我而言,它最终陷入了困境)。

    您现在需要重新启动 MySQL 守护程序,这可以通过杀死并启动当前正在运行的 mysqld 进程或重新启动 MySQL 服务来完成(运行 services.msc,找到 MySQL,按重新启动按钮;或从 cmd, net stop MySQL 后跟 net start MySQL)。

    【讨论】:

      【解决方案4】:

      如果使用 AWS RDS,可以使用 DB Parameter Groups 修改 max_allowed_pa​​cket

      【讨论】:

        【解决方案5】:

        max_allowed_pa​​cket 变量在配置文件(在我的例子中是 my.ini)中设置了默认值。如果您的应用程序尝试执行数据包大小超过此值的查询,则会引发此异常。

        我的设置是在装有 MySQL Server 8.0 的 Windows 10 机器上。

        我将带有我想要的 max_allowed_pa​​cket 值 (64M) 的 my.ini 文件复制到各种可能的位置(C:\my.ini、C:\Windows\my.ini)。然后重启了mysql服务器。它没有用。当我在数据库中查询 max_allowed_pa​​cket 变量时,该值保持不变。

        以下步骤有效:

        1. 我发现在不同的位置有一个 my.ini 文件。

        2. 打开位于以下位置 C:\ProgramData\MySQL\MySQL Server 8.0 的 my.ini 文件。这有很多条目,除了 max_allowed_pa​​cket。

        3. 找到 max_allowed_pa​​cket 的条目,并将其设置为所需的值(例如 64M)。

        4. 保存并关闭 my.ini 文件。

        5. 重启MySQL80服务。

        6. 登录到 mysql 服务器提示符并运行查询

           show variables like 'max_allowed_packet';
          
        7. 您应该会看到设置为所需值的值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-12-15
          • 2017-04-07
          • 2017-06-10
          • 2017-09-05
          相关资源
          最近更新 更多