如何使用Java将base64格式图片插入Oracle数据库的BLOB字段
解决方案
核心思路
不要直接拼接SQL传入长字符串,使用PreparedStatement预编译SQL+参数绑定的方式写入BLOB,完全避开SQL字面量长度限制、SQL截断、SQL注入等问题。
具体实现步骤
- 第一步:将base64格式的图片字符串解码为字节数组
- 第二步:使用预编译SQL,通过参数占位符绑定传入数据
- 第三步:执行插入操作
代码示例
import java.util.Base64; import java.sql.PreparedStatement; import java.sql.Connection; // 你的base64图片字符串 String image64 = "/9j/4AAQSkZJRgABAQAAAQABAAD......RzUUUBB2UtRREOFFFFpa//Z"; // 1. 解码base64为字节数组 byte[] imageBytes = Base64.getDecoder().decode(image64); // 2. 编写预编译SQL,用?作为参数占位符 String sql = "INSERT INTO INFO (IMAGE) VALUES (?)"; try (PreparedStatement pstmt = connection.prepareStatement(sql)) { // 3. 绑定BLOB参数,直接传入字节数组即可,JDBC会自动适配Oracle BLOB类型 pstmt.setBytes(1, imageBytes); // 4. 执行插入 pstmt.executeUpdate(); }
原方案失效原因说明
- ORA-01704报错是因为Oracle中硬编码在SQL里的字符串字面量默认最大长度为4000字节,超过就会触发报错
- 分片拼接的方案除了会遇到SQL总长度限制导致截断外,还存在性能差、容易出现语法错误、有SQL注入风险等问题,不推荐使用
- 如果确实需要在数据库层面完成base64转BLOB的操作,也可以用预编译绑定参数的方式,将base64字符串直接传入数据库函数处理,代码如下:
String sql = "INSERT INTO INFO (IMAGE) VALUES (utl_encode.base64_decode(utl_raw.cast_to_raw(?)))"; try (PreparedStatement pstmt = connection.prepareStatement(sql)) { pstmt.setString(1, image64); pstmt.executeUpdate(); }
内容的提问来源于stack exchange,提问作者Vinícius Abner
相关产品推荐
相关产品推荐

