BLOb:无法读取所有数据,但kb很少

时间:2012-11-30 15:12:40

标签: java mysql database file blob

我正在使用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。这是错误吗?

3 个答案:

答案 0 :(得分:3)

您的计划是正确的。如果文件大小很小,那么它将正常工作。如果您使用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
)

答案 1 :(得分:1)

如您所知,每个参数都有固定值长度,以下是示例。

    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

这个MAX大小不是bug,而是它存储值的长度

在您的情况下使用MEDIUMBLOBLONGBLOB

答案 2 :(得分:-1)

我几天前遇到了同样的问题,我所做的就是不使用InputStream可用的方法。

使用:

ps.setBinaryStream(2, fs);

但你必须验证,因为有一些jdbc驱动程序不支持它