【问题情况】
文件上传后要存在数据库里面,用blob类型,在oracle里面是运行正常的。 移植到mysql5的时候,上传报错,经过百度搜索,找到问题原因。mysql5的bolb字段,安装时默认是1M。
【异常提示】
Caused by: com.mysql.jdbc.PacketTooBigException: Packet for query is too large (5856352 > 1048576). You can change this value on the server by setting the max_allowed_packet' variable.
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3868)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2551)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2731)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2818)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2157)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2460)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2377)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2361)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)
at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:133)
... 67 more
【问题原因及解决办法】
MySQL的一个系统参数:max_allowed_packet,其默认值为1048576(1M),
查询:show VARIABLES like '%max_allowed_packet%';
修改此变量的值:
MySQL安装目录下的my.ini文件中的[mysqld]段中的"max_allowed_packet = 1M",(注意:有些mysql.ini文件中会没有这一行的)
找到[mysqld], 在这一行下面新增一行(本身有这行就修改)。改为31M。
max_allowed_packet = 31M
重起MySQL服务。
现在可以load大于1M的文件了
【顺便说一下mysql中blob的区别】
MySQL有四种BLOB类型:
TINYBLOB: 仅255个字符
BLOB: 最大限制到65K字节
MEDIUMBLOB: 限制到16M字节
LONGBLOB: 可达4GB
----------------------------------------
【有参考文章】http://hi.baidu.com/liyanqin2288/item/f0eb2b36b9fd5ecd2e8ec259