我使用BLOb支持插入和读取MySQl。(JDBC)我可以这么做,但当它读起来时,只有几kb。我不知道为什么。这是工作代码:
import java.sql.*;
import java.io.*;
public class InsertAndRetrieveImage {
public static void main(String[] args) throws SQLException, FileNotFoundException, IOException {
int id=7;
String connectionURL = "jdbc:mysql://127.0.0.1:3306/newdb";;
Connection con=null;
try{
Class.forName("com.mysql.jdbc.Driver");
con = DriverManager.getConnection(connectionURL, "root", "sesame");
PreparedStatement ps = null;
ps=con.prepareStatement("INSERT IGNORE INTO image VALUES(?,?,?)");
File file = new File("e:/anarkali.wav");
FileInputStream fs = new FileInputStream(file);
try{
System.out.println(fs.available());
ps.setInt(1,id);
ps.setBinaryStream(2,fs,fs.available());
String filen=file.getName();
ps.setString(3,filen);
int i = ps.executeUpdate();
String filename="filename";OutputStream os=null;byte[] content=null;
ps= con.prepareStatement("SELECT fs from image where id=7");
ResultSet rs = ps.executeQuery();
System.out.println(rs);
while(rs.next()) {
Blob blob = rs.getBlob("fs");
content = blob.getBytes(1, (int) blob.length());
os = new FileOutputStream(new File("e://testanar.wav"));
}
os.write(content);
os.close();
con.close();
ps.close();}
catch(SQLException e)
{System.out.println(e.getMessage());
}
}catch(Exception ex){}
}
这个问题是在阅读还是写作时出现的?我的BLOb的大小有点65535
。这是错误吗?
您的程序是正确的。如果文件大小很小,那么它会正常工作。如果使用BLOB
数据类型存储二进制数据,请将其更改为LONGBLOB
。因为如果您试图在BLOB
数据字段中保存文件,并且文件大小大于BLOB数据类型允许的最大大小,则内容将被截断,并且您将丢失文件的某些内容(取决于文件大小)。即使使用LONGBLOB
数据类型,也必须检查一些内容。我会解释
在mysql网站中,我们可以看到LONGBLOB
的最大文件大小是4GB。但这取决于很多事情。要存储大文件,你必须检查一些东西。首先,在my.ini
文件中,有一个名为max_allowed_packet
的属性,它指定了可以传输到mysql客户端或服务器或从其传输的最大数据包。您应该将max_allowed_packet
属性设置为更高的值。并重新启动mysql。某些文件系统不允许4GB文件。在这种情况下,你无法加载那么大的文件。
我认为在您的情况下,将max_allowed_packet
属性设置为更高的值将解决问题。
我认为您可以使用以下表格创建脚本
CREATE TABLE `image` (
`id` INT(10) NULL DEFAULT NULL,
`fs` LONGBLOB NULL,
`filen` VARCHAR(50) NULL DEFAULT NULL
)
正如您所知,每个参数都有固定的值长度,下面是示例。
0 < length <= 255 --> `TINYBLOB`
255 < length <= 65535 --> `BLOB`
65535 < length <= 16777215 --> `MEDIUMBLOB`
16777215 < length <= 2³¹-1 --> `LONGBLOB`
TINYBLOB: maximum length of 255 bytes
BLOB: maximum length of 65,535 bytes
MEDIUMBLOB: maximum length of 16,777,215 bytes
LONGBLOB: maximum length of 4,294,967,295 bytes
这个最大值不是错误,而是存储值的长度
在您的情况下,请使用MEDIUMBLOB
或LONGBLOB
。
几天前我遇到了同样的问题,我所做的就是不使用InputStream可用方法。
用途:
ps.setBinaryStream(2, fs);
但是您必须进行验证,因为有些jdbc驱动程序不支持