BLOB和CLOB都是大字段类型,BLOB是按二进制来存储的,而CLOB是可以直接存储文字的。其实两个是可以互换的的,或者可以直接用LOB字段代替这两个。但是为了更好的管理 ORACLE数据库, 通常像图片、文件、音乐等信息就用BLOB字段来存储,先将文件转为二进制再存储进去。 而像文章或者是较长的文字,就用CLOB存储,这样对以后的查询更新 存储等操作都提供很大的方便。
CLOB 定义
数据库中的一种保存文件所使用的类型。
Character Large Object
SQL 类型 CLOB 在 JavaTM 编程语言中的映射关系。SQL CLOB 是内置类型,它将字符大对象 (Character Large Object) 存储为数据库表某一行中的一个列值。默认情况下,驱动程序使用 SQL locator(CLOB) 实现 Clob 对象,这意味着 CLOB 对象包含一个指向 SQL CLOB 数据的逻辑指针而不是数据本身。Clob 对象在它被创建的事务处理期间有效。
在一些数据库系统里,也使用Text 作为CLOB的别名,比如SQL Server
BLOB的含义
BLOB (binary large object),二进制大对象,是一个可以存储二进制文件的容器。
在计算机中,BLOB常常是数据库中用来存储二进制文件的字段类型。
BLOB是一个大文件,典型的BLOB是一张图片或一个声音文件,由于它们的尺寸,必须使用特殊的方式来处理(例如:上传、下载或者存放到一个数据库)。
根据Eric Raymond的说法,处理BLOB的主要思想就是让文件处理器(如数据库管理器)不去理会文件是什么,而是关心如何去处理它。
但也有专家强调,这种处理大数据对象的方法是把双刃剑,它有可能引发一些问题,如存储的二进制文件过大,会使数据库的性能下降。在数据库中存放体积较大的多媒体对象就是应用程序处理BLOB的典型例子。
CLOB和BLOB的区别
CLOB使用CHAR来保存数据。 如:保存XML文档。
BLOB就是使用二进制保存数据。 如:保存位图。
存储文本文件
package jdbc;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.io.Reader;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Random;
import javax.swing.JApplet;
import com.mysql.cj.jdbc.Clob;
public class Demo10 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/jdbcTest?serverTimezone" +
"=UTC&characterEncoding=utf-8&useSSL=false","root","root");
String sql = "insert into to_user (username,myinfo,regTime,lastLoginTime) values (?,?,?,?)";
ps = conn.prepareStatement(sql);
ps.setObject(1, "john");
//将文本文件内容输入到数据库中
// ps.setClob(2, new FileReader(new File("d:/a.txt")));
//将程序中的字符串输入到数据库的clob中
ps.setClob(2, new BufferedReader(new InputStreamReader(new ByteArrayInputStream("today is monday".getBytes()))));
ps.setObject(3, new java.sql.Date(System.currentTimeMillis()));
ps.setObject(4, new java.sql.Date(System.currentTimeMillis()));
ps.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if (rs != null) {
rs.close();
}
} catch (SQLException e1) {
e1.printStackTrace();
}
try {
if (ps != null) {
ps.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
读取保存的文本内容
package jdbc;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.io.Reader;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Random;
import javax.swing.JApplet;
import com.mysql.cj.jdbc.Clob;
public class Demo11 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/jdbcTest?serverTimezone" +
"=UTC&characterEncoding=utf-8&useSSL=false","root","root");
String sql = "select * from to_user where id=?";
ps = conn.prepareStatement(sql);
ps.setObject(1, 27714);
rs = ps.executeQuery();
while (rs.next()) {
Clob c = (Clob) rs.getClob("myinfo");
Reader r = c.getCharacterStream();
int temp = 0;
while ((temp = r.read()) != -1) {
System.out.print((char)temp);
}
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if (rs != null) {
rs.close();
}
} catch (SQLException e1) {
e1.printStackTrace();
}
try {
if (ps != null) {
ps.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
BLOB 存储文件
package jdbc;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.io.Reader;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Random;
import javax.swing.JApplet;
import com.mysql.cj.jdbc.Clob;
public class Demo12 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/jdbcTest?serverTimezone" +
"=UTC&characterEncoding=utf-8&useSSL=false","root","root");
ps = conn.prepareStatement("insert into to_user (username,headimg,regTime,lastLoginTime) values (?,?,?,?)");
ps.setString(1, "john");
//存储文件
ps.setBlob(2, new FileInputStream("d:/1.png"));
ps.setObject(3, new java.sql.Date(System.currentTimeMillis()));
ps.setObject(4, new java.sql.Date(System.currentTimeMillis()));
ps.execute();
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if (rs != null) {
rs.close();
}
} catch (SQLException e1) {
e1.printStackTrace();
}
try {
if (ps != null) {
ps.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
BLOB读取文件
package jdbc;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Demo13 {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
InputStream is = null;
OutputStream os = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection( "jdbc:mysql://localhost:3306/jdbcTest?serverTimezone" +
"=UTC&characterEncoding=utf-8&useSSL=false","root","root");
ps = conn.prepareStatement("select * from to_user where id = ?");
ps.setObject(1, 27716);
rs = ps.executeQuery();
while (rs.next()) {
Blob b = rs.getBlob("headimg");
is = b.getBinaryStream();
os = new FileOutputStream("d:2.png");
int temp = 0;
//从数据库读取图片并保存到D:/2.png
while ((temp = is.read()) != -1) {
os.write(temp);
}
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
try {
if (is!= null) {
is.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
if (os!= null) {
os.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (rs != null) {
rs.close();
}
} catch (SQLException e1) {
e1.printStackTrace();
}
try {
if (ps != null) {
ps.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}