com.mysql.jdbc.PacketTooBigException

时间:2012-07-03 22:42:45

标签: mysql blob packet

我在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

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

Adding Image to a database in Java


更新2

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

SET GLOBAL max_allowed_packet = 1024*1024*14;

5 个答案:

答案 0 :(得分:22)

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

  

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

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

答案 1 :(得分:2)

对于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

确保包含<{>> 设置[mysqld],否则无法启动(对我而言,它最终会陷入困境)。

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

答案 2 :(得分:1)

以下为我工作

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

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

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

答案 3 :(得分:0)

如果使用AWS RDS,则可以使用DB Parameter Groups

修改max_allowed_pa​​cket

答案 4 :(得分:0)

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. 在以下位置打开 my.ini 文件 C:\ProgramData\MySQL\MySQL Server 8.0。这有很多条目,除了 max_allowed_pa​​cket。

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

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

  5. 重启 MySQL80 服务。

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

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