mysql5的bolb字段,安装时默认是1M,会提示报错。

MySQL Blob类型与max_allowed_packet
探讨MySQL中Blob类型的使用及max_allowed_packet参数调整方法,解决文件上传超过默认大小限制的问题。

【问题情况】

 文件上传后要存在数据库里面,用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

在Java中读取数据库中的BLOB字段、修改其中的内容并重新写回数据库,通常涉及以下步骤: 1. **从数据库中读取BLOB字段** 使用JDBC的`ResultSet`类读取BLOB数据,可以将其转换为字节数组或输入流,以便进一步处理。 例如,使用`getBlob()`方法获取BLOB对象,并通过`getBinaryStream()`或`getBytes()`方法读取其内容: ```java Blob blob = rs.getBlob("blob_column"); InputStream inputStream = blob.getBinaryStream(); byte[] blobData = blob.getBytes(1, (int) blob.length()); ``` 2. **修改BLOB内容** 如果BLOB数据是文本格式(如XML、JSON等),可以将其转换为字符串进行修改,然后再转换为字节数组: ```java String blobContent = new String(blobData, StandardCharsets.UTF_8); String modifiedContent = blobContent.replace("old_text", "new_text"); byte[] updatedBlobData = modifiedContent.getBytes(StandardCharsets.UTF_8); ``` 如果BLOB是二进制文件(如图片、PDF),则需要使用相应的库进行修改,例如使用`BufferedImage`处理图像或使用PDF库(如iText)处理PDF文件。 3. **将修改后的内容写回数据库** 使用`PreparedStatement`的`setBlob()`方法将修改后的字节数组写回数据库: ```java PreparedStatement ps = connection.prepareStatement("UPDATE table_name SET blob_column = ? WHERE id = ?"); ps.setBytes(1, updatedBlobData); ps.setInt(2, recordId); ps.executeUpdate(); ``` 或者,如果数据较大,可以使用`InputStream`方式写入: ```java ps.setBinaryStream(1, new ByteArrayInputStream(updatedBlobData)); ``` 4. **注意事项** - 处理大文件,应考虑使用流式读写以避免内存溢出。 - 不同数据库驱动对BLOB的处理方式可能略有不同,例如Oracle和MySQL在某些版本中对BLOB的处理存在差异。 - 修改BLOB内容前,建议进行数据备份,防止误操作导致数据丢失[^1]。 ### 示例代码 以下是一个完整的示例,展示如何读取BLOB字段、修改其内容并更新回数据库: ```java import java.sql.*; import java.nio.charset.StandardCharsets; public class BlobExample { public static void main(String[] args) throws Exception { String url = "jdbc:mysql://localhost:3306/testdb"; String user = "root"; String password = "password"; Connection conn = DriverManager.getConnection(url, user, password); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT id, blob_column FROM blob_table WHERE id = 1"); if (rs.next()) { Blob blob = rs.getBlob("blob_column"); byte[] blobData = blob.getBytes(1, (int) blob.length()); String content = new String(blobData, StandardCharsets.UTF_8); String modifiedContent = content.replace("old_value", "new_value"); byte[] updatedData = modifiedContent.getBytes(StandardCharsets.UTF_8); PreparedStatement ps = conn.prepareStatement("UPDATE blob_table SET blob_column = ? WHERE id = ?"); ps.setBytes(1, updatedData); ps.setInt(2, rs.getInt("id")); ps.executeUpdate(); } rs.close(); stmt.close(); conn.close(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值