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

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

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


更新 2

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

SET GLOBAL max_allowed_packet = 1024*1024*14;
4

5 回答 5

25

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

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

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

于 2012-07-03T22:44:08.133 回答
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.inimy.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) .

于 2016-04-12T08:57:48.153 回答
1

以下为我工作

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

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

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

于 2015-04-24T02:44:40.923 回答
0

如果使用 AWS RDS,可以使用数据库参数组修改 max_allowed_pa​​cket

于 2018-07-31T07:45:20.527 回答
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. 打开位于以下位置 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. 您应该看到该值设置为您想要的值。

于 2020-12-23T22:07:44.400 回答