1.MySQL中的BLOB類型
Mysql中可以存儲大文件數據,一般使用的BLOB對象。如圖片,視頻等等。
BLOB是一個二進制大對象,可以容納可變數量的數據。因為是二進制對象,所以與編碼方式無關。有4種BLOB類型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它們只是可容納值的最大長度不同。
四種字段類型保存的最大長度如下:
TINYBLOB - 255 bytes
BLOB - 65535 bytes(64KB)
MEDIUMBLOB - 16,777,215 bytes(16MB) (2^24 - 1)
LONGBLOB - 4G bytes (2^32 – 1)
2.java對MySQL圖片的讀取
下面是test數據庫中定義的phototest表結構。
id | int(11) | YES |
photo | mediumblob | YES |
保存與讀取圖片的代碼如下:
1 import java.io.*; 2 import java.sql.*; 3 public class LoadStoreBLOB { 4 public static void main(String[] args) { 5 DBConnection DB = new DBConnection(); //負責連接MySQl數據庫的類 6 Connection con = null; 7 PreparedStatement ps = null; 8 ResultSet rs = null; 9 InputStream in = null; 10 try { 11 //從本地硬盤硬盤讀取一張圖片保存到數據庫 12 con=DB.getConn(); 13 in=new FileInputStream("sdf.png"); 14 ps=con.prepareStatement("insert into test.phototest values(?,?)"); 15 ps.setInt(1,2); 16 ps.setBinaryStream(2, in, in.available()); 17 ps.executeUpdate(); 18 in.close(); 19 DB.closeConn(con); 20 21 //從數據庫讀取圖片保存到本地硬盤 22 con=DB.getConn(); 23 ps=con.prepareStatement("select * from test.phototest where id=?"); 24 ps.setInt(1,2); 25 rs=ps.executeQuery(); 26 rs.next(); //將光標指向第一行 27 in=rs.getBinaryStream("photo"); 28 byte[] b=new byte[in.available()]; //新建保存圖片數據的byte數組 29 in.read(b); 30 OutputStream out=new FileOutputStream("222.jpg"); 31 out.write(b); 32 out.flush(); 33 out.close(); 34 DB.closeConn(con); 35 } 36 catch (Exception e) { 37 System.out.println("Error::"+e); 38 } 39 } 40 }
3.選擇合適的字段大小
如果選擇的字段類型的最大長度較小,放不下保存的數據,可能會報出MySQL數據截斷異常。如:
com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'photo' at row 1
Mysql 中文參考手冊列類型:
http://dev.mysql.com/doc/refman/5.1/zh/column-types.html#blob