我在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.
我认为这只与图像尺寸有关。我可以使用其他任何变量类型吗?
根据较旧的问题,我也尝试使用MEDIUMBLOB
,但我仍然遇到同样的错误。
Adding Image to a database in Java
在项目开始时,我执行以下查询,现在一切正常
SET GLOBAL max_allowed_packet = 1024*1024*14;
答案 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_packet值 我把它设置为 max_allowed_packet的= 200M
确保重新启动MySQL以使更改生效
答案 3 :(得分:0)
如果使用AWS RDS,则可以使用DB Parameter Groups
修改max_allowed_packet答案 4 :(得分:0)
max_allowed_packet 变量在配置文件(在我的例子中是 my.ini)中设置了一个默认值。如果您的应用程序尝试执行数据包大小超过此值的查询,则会引发此异常。
我的设置是在装有 MySQL Server 8.0 的 Windows 10 机器上。
我将带有 max_allowed_packet 所需值 (64M) 的 my.ini 文件复制到各种可能的位置(C:\my.ini、C:\Windows\my.ini)。然后重启mysql服务器。它没有用。当我查询数据库中的 max_allowed_packet 变量时,该值保持不变。
以下步骤有效:
我发现在其他位置有一个 my.ini 文件。
在以下位置打开 my.ini 文件 C:\ProgramData\MySQL\MySQL Server 8.0。这有很多条目,除了 max_allowed_packet。
找到 max_allowed_packet 的条目,并将其设置为所需的值(例如 64M)。
保存并关闭 my.ini 文件。
重启 MySQL80 服务。
登录到 mysql 服务器提示符并运行查询
show variables like 'max_allowed_packet';
您应该会看到设置为所需值的值。