数据库中保存音频mysql,保存的音频

发布时间:2023-12-08

数据库中保存音频mysql,保存的音频

更新:2022-11-24 13:14

本文目录一览:

  1. mysql中哪几类字符类型可以存储音视频文件
  2. 音视频以二进制流的方式存进mysql数据库,怎么从数据库中下载,使二进制转换成相应的格式
  3. 怎么把图片,视频存储在数据库中
  4. 怎样把多媒体信息(如音频文件,视频文件)存到数据库中,然后在一JSP页面显示,数据库是mysql的
  5. 如何在mysql中存储音乐和图片文件
  6. [如何在mysql 或者 其他的数据库中存放图片 音频 视频](#如何在mysql 或者 其他的数据库中存放图片 音频 视频)

mysql中哪几类字符类型可以存储音视频文件

二进制类型,例如:binary、varbinary、bit、tinyblob、blob、mediumblob和longblob,

音视频以二进制流的方式存进mysql数据库,怎么从数据库中下载,使二进制转换成相应的格式

  1. 将Image图像文件存入到数据库中 我们知道数据库里的Image类型的数据是"二进制数据",因此必须将图像文件转换成字节数组才能存入数据库中. 要这里有关数据的操作略写,我将一些代码段写成方法,方便直接调用.
//根据文件名(完全路径)
public byte[] SetImageToByteArray(string fileName)
{
    FileStream fs = new FileStream(fileName, FileMode.Open);
    int streamLength = (int)fs.Length;
    byte[] image = new byte[streamLength];
    fs.Read(image, 0, streamLength);
    fs.Close();
    return image;
}

//另外,在ASP.NET中通过FileUpload控件得到的图像文件可以通过以下方法

public byte[] SetImageToByteArray(FileUpload FileUpload1)
{
    Stream stream = FileUpload1.PostedFile.InputStream;
    byte[] photo = new byte[FileUpload1.PostedFile.ContentLength];
    stream.Read(photo, 0, FileUpload1.PostedFile.ContentLength);
    stream.Close();
    return photo;
}
  1. 从SQL Server数据库读取Image类型的数据,并转换成bytes[]或Image图像文件 //要使用SqlDataReader要加载using System.Data.SqlClient命名空间 //将数据库中的Image类型转换成byte[]
public byte[] SetImage(SqlDataReader reader)
{
    return (byte[])reader["Image"];//Image为数据库中存放Image类型字段
}

//将byte[]转换成Image图像类型 //加载以下命名空间using System.Drawing;/using System.IO;

public Image SetByteToImage(byte[] mybyte)
{
    Image image;
    MemoryStream mymemorystream = new MemoryStream(mybyte,0, mybyte.Length);
    image = Image.FromStream(mymemorystream);
    return image;
}

怎么把图片,视频存储在数据库中

我们设计程序时一般不会将图片、音频和视频资料直接存入数据库中,这样会让数据库的体积骤大,严重影响数据库运行的效率。 一般会搭建一个多媒体服务器,支持流媒体格式处理。程序或者网站中涉及到的图片、音频和视频等资料会存放在流媒体服务器上,然后可以记录访问其的路径,然后把这个路径存入数据库,在你的应用系统调用时,可以通过路径结合对应的多媒体播放插件就可以实现。

怎样把多媒体信息(如音频文件,视频文件)存到数据库中,然后在一JSP页面显示,数据库是mysql的

采用大对象类型。 mysql 大对象存取: 类型一般应该用mediumblod, blob只能存2的16次方个byte, mediumblod是24次方, 一般来说够用了.longblob是32次方有些大. MYSQL默认配置只能存1M大小的文件,要修改配置,WIN版本的在mysql.ini文件中 修改max_allowed_packet,net_buffer_length等几个参数,或直接SET GLOBAL varName=value. linux版本可以在启动参数后加-max_allowed_packet=xxM等几个参数. MYSQL存大对象最好直接就setBinaryStream,又快又方便. 而不要先插入空再造型成BLOB然后再setBlob 例子:

import java.sql.*;
import java.io.*;
public class DBTest {
    static String driver = "org.gjt.mm.mysql.Driver";
    static String url = "jdbc:mysql://localhost:3306/test";
    static String user = "root";
    static String passwd = "passwd";
    public static void main(String[] args) throws Exception {
        Connection conn = null;
        try {
            Class.forName(driver);
            conn = DriverManager.getConnection(url,user,passwd);
            int op = 1;
            //插入
            if (op == 0) {
                PreparedStatement ps = conn.prepareStatement("insert into tb_file values (?,?)");
                ps.setString(1, "aaa.exe");
                InputStream in = new FileInputStream("d:/aaa.exe");
                ps.setBinaryStream(2,in,in.available());
                ps.executeUpdate();
                ps.close();
            }
            else {
                //取出
                PreparedStatement ps = conn.prepareStatement("select * from tb_file where filename = ?");
                ps.setString(1, "aaa.exe");
                ResultSet rs = ps.executeQuery();
                rs.next();
                InputStream in = rs.getBinaryStream("filecontent");
                System.out.println(in.available());
                FileOutputStream out = new FileOutputStream("d:/bbb.exe");
                byte[] b = new byte[1024];
                int len = 0;
                while ( (len = in.read(b)) != -1) {
                    out.write(b, 0, len);
                    out.flush();
                }
                out.close();
                in.close();
                rs.close();
                ps.close();
            }
        }
        catch (Exception ex) {
            ex.printStackTrace(System.out);
        }
        finally {
            try {conn.close();}
            catch (Exception ex) { }
        }
    }
}

如何在mysql中存储音乐和图片文件

图片和音乐可以用二进制进行存储 ,首先,你必须在你的mysql中建立一个新的数据库,我们将会把那些二进制文件储存在这个数据库里。在例子中我会使用下列结构,为了建立数据库,你必须做下列步骤:

  • 进入MySql控制器
  • 输入命令”create database binary_data;”
  • 输入命令”use binary_data;”
  • 输入命令”CREATE TABLE binary_data ( id INT(4) NOT NULL AUTO_INCREMENT PRIMARY KEY, description CHAR(50), bin_data LONGBLOB, filename CHAR(50), filesize CHAR(50), filetype CHAR(50));” (不能断行) 如果没有意外,数据库 和 表 应该建立好了。 一个怎样储存文件的例子程序 用这个例子你可以通过Html表单将文件传输到数据库中。

如何在mysql 或者 其他的数据库中存放图片 音频 视频

背景

MySQL 一直以来都有 TEXT、BLOB 等类型用来存储图片、视频等大对象信息。比如一张图片,随便一张都 5M 以上。视频也是,随便一部视频就是 2G 以上。 假设用 MySQL 来存放电影视频等信息,一部是 2G,那么存储 1000 部就是 2TB,2TB 也就是 1000 条记录而已,但是对数据库性能来说,不仅仅是看记录数量,更主要的还得看占用磁盘空间大小。空间大了,所有以前的经验啥的都失效了。 所以一般来说存放这类信息,也就是存储他们的存放路径,至于文件本身存放在哪里,那这就不是数据库考虑的范畴了。数据库只关心怎么来的快,怎么来的小。

举例

虽然不推荐 MySQL 这样做,但是也得知道 MySQL 该怎么做才行,做到心里有数。比如下面一张微信图片,大概 5M 的样子。

root@ytt:/var/lib/mysql-files# ls -sihl 微信图片_20190711095019.jpg
274501 5.4M -rw-r--r-- 1 root root 5.4M Jul 11 07:17 微信图片_20190711095019.jpg

拷贝 100 份这样的图片来测试

root@ytt:/var/lib/mysql-files# for i in `seq 1 100`; do cp 微信图片_20190711095019.jpg "$i".jpg;done;

我们建三张表,分别用 LONGBLOB、LONGTEXT 和 VARCHAR 来存储这些图片信息

CREATE TABLE `tt_image1` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `image_file` longblob,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
CREATE TABLE `tt_image2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `image_file` longtext,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
CREATE TABLE `tt_image3` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `image_file` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

我们来给三张表插入 100 张图片(插入前,建议把 max_allowed_packet 设置到最大)

for i in `seq 1 100`; do mysql -S /var/run/mysqld/mysqld.sock -e "insert into ytt.tt_image1(image_file) values (load_file('/var/lib/mysql-files/$i.jpg'))"; done;
for i in `seq 1 100`; do mysql -S /var/run/mysqld/mysqld.sock -e "insert into ytt.tt_image2(image_file) values (hex(load_file('/var/lib/mysql-files/$i.jpg')))"; done;
aa='begin;';
for i in `seq 1 100`; do
    aa=$aa"insert into ytt.tt_image3(image_file) values ('/var/lib/mysql-files/$i.jpg');";
done;
aa=$aa'commit;';
mysql -S /var/run/mysqld/mysqld.sock -e "`echo $aa`";

检查下三张表记录数

SELECT 'tt_image1' AS name ,COUNT(*) FROM tt_image1 
UNION ALL
SELECT 'tt_image2',COUNT(*) FROM tt_image2 
UNION ALL 
SELECT 'tt_image3', COUNT(*) FROM tt_image3;

看下文件大小,可以看到实际大小排名,LONGTEXT 字段存储的最大,LONGBLOB 字段缩小到一半,最小的是存储图片路径的表 tt_image3。所以这里从存储空间来看,存放路径最占优势。

root@ytt:/var/lib/mysql/ytt# ls -silhS tt_image*
274603 1.1G -rw-r----- 1 mysql mysql 1.1G Jul 11 07:27 tt_image2.ibd
274602 545M -rw-r----- 1 mysql mysql 544M Jul 11 07:26 tt_image1.ibd
274605  80K -rw-r----- 1 mysql mysql 112K Jul 11 07:27 tt_image3.ibd

那么怎么把图片取出来呢? tt_image3 肯定是最容易的

SELECT * FROM tt_image3;

tt_image1 直接导出来二进制文件即可,下面我写了个存储过程,导出所有图片。

DELIMITER $$
USE `ytt`$$
DROP PROCEDURE IF EXISTS `sp_get_image`$$
CREATE DEFINER=`ytt`@`localhost` PROCEDURE `sp_get_image`()
BEGIN
    DECLARE i,cnt INT DEFAULT 0;
    SELECT COUNT(*) FROM tt_image1 WHERE 1 INTO cnt;
    WHILE i < cnt DO
        SET @stmt = CONCAT('SELECT image_file FROM tt_image1 LIMIT ',i,',1 INTO DUMPFILE ''/var/lib/mysql-files/image',i,'.jpg''');
        PREPARE s1 FROM @stmt;
        EXECUTE s1;
        DROP PREPARE s1;
        SET i = i + 1;
    END WHILE;
END$$
DELIMITER ;
CALL sp_get_image();

tt_image2 类似,把 SELECT 语句里 image_file 变为 unhex(image_file) 即可。

总结

这里我举了个用 MySQL 来存放图片的例子,总的来说有以下三点:

  • 占用磁盘空间大(这样会带来各种各样的功能与性能问题,比如备份,写入,读取操作等)
  • 使用不易
  • 还是推荐用文件路径来代替实际的文件内容存放