所谓的数据库就是可以存放各种数据的一个大的集合,前边我们进行数据库的存储仅仅局限一些简单数据的存储,今天进行视频,音频这类大文件在数据库的存储:
mysql数据库数据类型:
在 MySQL 中,有三种主要的类型:文本、数字和日期/时间类型。
- 字符串类型:
类型 | 大小 | 用途 |
---|---|---|
CHAR | 0-255字节 | 定长字符串 |
VARCHAR | 0-65535 字节 | 变长字符串 |
TINYTEXT | 0-255字节 | 短文本字符串 |
TEXT | 0-65 535字节 | 长文本数据 |
MEDIUMTEXT | 0-16 777 215字节 | 中等长度文本数据 |
LONGTEXT | 0-4 294 967 295字节 | 极大文本数据 |
TINYBLOB | 0-255字节 | 不超过 255 个字符的二进制字符串 |
BLOB | 0-65 535字节 | 二进制形式的长文本数据 |
MEDIUMBLOB | 0-16 777 215字节 | 二进制形式的中等长度文本数据 |
LONGBLOB | 0-4 294 967 295字节 | 二进制形式的极大文本数据 |
BLOB 是一个二进制大对象,可以容纳可变数量的数据。有 4 种 BLOB 类型:TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们区别在于可容纳存储范围不同。
有 4 种 TEXT 类型:TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。对应的这 4 种 BLOB 类型,可存储的最大长度不同,可根据实际情况选择。
- 日期和时间类型
表示时间值的日期和时间类型为DATETIME、DATE、TIMESTAMP、TIME和YEAR。
类型 | 大小(字节) | 范围 | 格式 | 用途 |
---|---|---|---|---|
DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
TIME | 3 | '-838:59:59'/'838:59:59' | HH:MM:SS | 时间值或持续时间 |
YEAR | 1 | 1901/2155 | YYYY | 年份值 |
DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 |
TIMESTAMP | 4 | 1970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07 | YYYYMMDD HHMMSS | 混合日期和时间值,时间戳 |
- 数值类型
类型 | 大小(字节) | 范围(有符号) | 范围(无符号) | 用途 |
---|---|---|---|---|
TINYINT | 1 字节 | (-128,127) | (0,255) | 小整数值 |
SMALLINT | 2字节 | (-32 768,32 767) | (0,65 535) | 大整数值 |
MEDIUMINT | 3 字节 | (-8 388 608,8 388 607) | (0,16 777 215) | 大整数值 |
INT或INTEGER | 4 字节 | (-2 147 483 648,2 147 483 647) | (0,4 294 967 295) | 大整数值 |
BIGINT | 8节 | (-9,223,372,036,854,775,808,9 223 372 036 854 775 807) | (0,18 446 744 073 709 551 615) | 极大整数值 |
FLOAT | 4 字节 | (-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 单精度浮点数值 |
DOUBLE | 8 字节 | (-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 双精度浮点数值 |
DECIMAL | 对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2 | 依赖于M和D的值 | 依赖于M和D的值 | 小数值 |
现我们操作的是音频文件,一般的音频文件大小在5M左右,所以我们这里选用的数据类型是字符串类型中的MEDIUMBLOB;
创建表tb_media,且表结构为:
+----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| filename | varchar(50) | YES | | NULL | |
| data | mediumblob | YES | | NULL | |
+----------+-------------+------+-----+---------+----------------+
现我们将本地文件存储到数据库表tb_media中,代码实现如下:
@Test
public void saveMP3IntoDatabase() {
String sql = "insert into tb_media values(?,?,?)";
String fileUrl = "/Users/wujinli/Music/网易云音乐/Nightcore - Monsters.mp3";
Connection connection = null;
PreparedStatement pst = null;
try {
connection = JDBCUtils.getConnection();
pst = connection.prepareStatement(sql);
pst.setInt(1, 1);
pst.setString(2, "Nightcore - Monsters");
//SerialBlob是Blob的实现类 ;IOUtil是org.apache提供的工具类包
SerialBlob serialBlob = new SerialBlob(IOUtils.toByteArray(new FileInputStream(fileUrl)));
//存储大文本信息使用的方法setBlob
pst.setBlob(3, serialBlob);
pst.executeUpdate();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
JDBCUtils.closeConnection(null, pst, connection);
}
}
运行测试项目获取结果,查看数据库:
071701.png
可以看出数据存储成功,接下来我们可以针对数据库的数据存储到本地的操作:
/**
* 将数据库的音频信息存储到本地
*/
@Test
public void getMediaFromDatabase() {
Connection connection = null;
//查询数据sql语句模版
String sql = "SELECT * FROM tb_media";
PreparedStatement pst = null;
ResultSet rs = null;
try {
//获取数据库连接
connection = JDBCUtils.getConnection();
//获取操作数据库对象
pst = connection.prepareStatement(sql);
//查询数据库表tb_media中的数据
rs = pst.executeQuery();
//遍历获取数据
if (rs.next()) {
Blob blob = rs.getBlob("data");
//使用工具类将获取的数据写到本地文件夹下
IOUtils.copy(blob.getBinaryStream(),
new FileOutputStream("/Users/wujinli/Music/Nightcore - Monsters.mp3"));
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
JDBCUtils.closeConnection(rs, pst, connection);
}
}
运行程序查看本地文件:
071702.png
071703.png
由此可以看出从数据库获取的信息存储本地文件成功!
网友评论