【问题标题】:BLOb: cannot read all data,but few kbBLOb:无法读取所有数据,但只有几 kb
【发布时间】:2012-11-18 19:57:47
【问题描述】:

我正在使用 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.length() 的实际值是多少(就在Blob blob = rs.getBlob("fs"); 之后)?
  • @YaK 它没有显示 blob.length()。它抛出异常 null。有什么问题??我知道它的大小和内容,但是什么?

标签: java mysql database file blob


【解决方案1】:

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

使用:

ps.setBinaryStream(2, fs);

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

【讨论】:

    【解决方案2】:

    你知道每个参数都有固定的值长度,这里是例子。

        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
    

    这个最大尺寸不是错误,而是它存储值的长度

    在你的情况下使用MEDIUMBLOBLONGBLOB

    【讨论】:

    • 好吧,我正在使用 MySql,并且只有一种类型:BLOb。它是一种中等大小的 blob。但我确信问题不在于 BLOb 的大小,而在于执行。
    【解决方案3】:

    你的程序是正确的。如果文件大小很小,那么它可以正常工作。如果您使用BLOB 数据类型来存储该二进制数据,请将其更改为LONGBLOB。因为如果您尝试将文件保存在 BLOB 数据字段中,并且如果文件大小超过 BLOB 数据类型的最大允许大小,那么内容将被截断并且您将丢失文件的一些内容(取决于文件大小)。即使您使用LONGBLOB 数据类型,您也必须检查一些事项。我来解释一下

    在 mysql 网站中,我们可以看到 LONGBLOB 的最大文件大小为 4GB。但这取决于很多事情。要存储大文件,您必须检查一些事情。首先是在my.ini 文件中,有一个名为max_allowed_packet 的属性,它指定可以传输到mysql 客户端或服务器或从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
    )
    

    【讨论】:

    • @joeyrohan- 修改该值后重新启动 mysql?
    • @joeyrohan- 还告诉我 'e:/anarkali.wav' 的文件大小是多少?
    • 是的..我在大约 1 个月前尝试了 10 次。没有结果。 anarkali.wav 大约 4 mb。
    猜你喜欢
    • 2020-08-15
    • 2016-07-10
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 2019-07-26
    相关资源
    最近更新 更多