1. 什么是大的数据?
所谓大的数据,就是大的字节数据,或大的字符数据。标准SQL中提供了如下类型来保存大数据类型:
类型 | 长度 |
---|---|
tinyblob | 28–1B(256B) |
blob | 216-1B(64K) |
mediumblob | 224-1B(16M) |
longblob | 232-1B(4G) |
tinyclob | 28–1B(256B) |
clob | 216-1B(64K) |
mediumclob | 224-1B(16M) |
longclob | 232-1B(4G) |
其中上面的四种blob是存储大的字节数据,下面四种clob是存储大的字符数据。
但是,在mysql中没有提供tinyclob、clob、mediumclob、longclob四种类型,而是使用如下四种类型来处理文本大数据:
类型 | 长度 |
---|---|
tinytext | 28–1B(256B) |
text | 216-1B(64K) |
mediumtext | 224-1B(16M) |
longtext | 232-1B(4G) |
接下来我们做一个演示。
在此之前,我们先修改一下mysql的配置文件,把最大的包文件大小设置为10M。
在my.ini中添加如下配置:max_allowed_packet=10485760
代码:
- 首先我们需要创建一张表,表中要有一个
mediumblob
(16M)类型的字段。CREATE TABLE tab_bin( id INT PRIMARY KEY AUTO_INCREMENT, filename VARCHAR(100), data MEDIUMBLOB );
- 存储数据代码:
/** * 把 MP3保存到数据库中。 */ public static void fun1() throws ClassNotFoundException, SQLException, IOException { String url = "jdbc:mysql://localhost:3306/test"; String username = "root"; String password = "0000"; Class.forName("com.mysql.jdbc.Driver"); Connection connection = DriverManager.getConnection(url, username, password); String sql = "insert into tab_bin values(?,?,?)"; PreparedStatement preparedStatement = connection.prepareStatement(sql); preparedStatement.setInt(1, 1); preparedStatement.setString(2, "xxx.mp3"); /** * 我们需要得到一个Blob * 先把文件变成 byte[],这里我们使用一个工具类的方法,这个工具类,大家可以在资源下载里下载。 * 再使用byte[]创建Blob */ //把文件变成byte[] byte[] bytes = IOUtils.toByteArray(new FileInputStream("F://xxx.mp3")); Blob blob = new SerialBlob(bytes); preparedStatement.setBlob(3, blob); preparedStatement.execute(); }
- 取出数据代码:
/** * 从数据库中读取 MP3。 */ public void fun2() throws ClassNotFoundException, SQLException, IOException { String url = "jdbc:mysql://localhost:3306/test"; String username = "root"; String password = "0000"; Class.forName("com.mysql.jdbc.Driver"); Connection connection = DriverManager.getConnection(url, username, password); String sql = "select * from tab_bin"; PreparedStatement preparedStatement = connection.prepareStatement(sql); ResultSet resultSet = preparedStatement.executeQuery(sql); // 获取resultSet中列为data的数据 if (resultSet.next()) { Blob blob = resultSet.getBlob("data"); // 把blob变成硬盘上的文件 // 通过blob得到输入流对象 // 自己创建输出流对象 // 把输入流数据写入到输出流中 InputStream inputStream = blob.getBinaryStream(); OutputStream out = new FileOutputStream("F://yyy.mp3"); IOUtils.copy(inputStream,out); } }