com.mysql.jdbc.PacketTooBigException

20

我正在将图片存储在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

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

在Java中将图像添加到数据库中


更新2

在项目开始时,我执行了下面的查询,现在一切都正常工作。

SET GLOBAL max_allowed_packet = 1024*1024*14;

这个错误与 MySQL 接收数据时的缓冲区大小有关。该参数的适当大小约为 15M。附注:不建议将图片存储在数据库中。 - Alfabravo
5个回答

25
作为错误提示,它与变量类型无关,而是与max_allowed_packet变量有关:

如果您正在使用大的BLOB列或长字符串,则必须增加此值。它应该尽可能大地与您想要使用的最大BLOB相同。max_allowed_packet的协议限制为1GB。该值应该是1024的倍数;非倍数将向下舍入到最近的倍数。

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

我理解,但我的客户坚决要求存储在 MySQL 中 :( - Fahim Parkar
1
@FahimParkar:那就增加 max_allowed_packet 的值? - eggyal
只是好奇如何设置 max_allowed_packet - Fahim Parkar
1
@FahimParkar: SET GLOBAL max_allowed_packet = .....。如果您希望在服务器重新启动后保持设置,最好在MySQL配置文件中进行设置。 - eggyal
3
谢谢帮忙,现在问题已经解决了。我设置了 SET GLOBAL max_allowed_packet = 1024 * 1024 * 14,也就是14MB。 - Fahim Parkar

2

针对Windows用户:

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

打开命令提示符,进入 %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)。


1

以下方法对我有效

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

然后修改max_allowed_packet值 我将其设置为 max_allowed_packet=200M

确保重启MySQL以使更改生效


0

如果使用AWS RDS,可以使用DB参数组来修改max_allowed_packet。


0

max_allowed_packet变量在配置文件(我的情况下是my.ini)中有默认值。如果您的应用程序尝试执行一个超过此值的数据包大小的查询,将抛出此异常。

我的设置在Windows 10机器上使用MySQL Server 8.0。

我复制了带有我所需的max_allowed_packet值(64M)的my.ini文件到各种可能的位置(C:\my.ini,C:\Windows\my.ini)。然后重新启动mysql服务器。但它没有起作用。当我查询max_allowed_packet变量的数据库时,该值仍然没有改变。

以下步骤有效:

  1. 我发现my.ini文件存放在不同位置。

  2. 在以下文件夹中打开my.ini文件:C:\ProgramData\MySQL\MySQL Server 8.0。除了max_allowed_packet之外,里面还有许多条目。

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

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

  5. 重新启动MySQL80服务。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接