以字节数组和二进制 (BLOB) 存储图像之间的区别以及哪个更快

Posted

技术标签:

【中文标题】以字节数组和二进制 (BLOB) 存储图像之间的区别以及哪个更快【英文标题】:Difference between storing images in byte array and binary (BLOB) and which one is faster 【发布时间】:2014-11-01 13:48:44 【问题描述】:

我想在 jdbc 中插入和选择来自 sql server 的图像。我很困惑 BLOB 和 byte 是相同的还是不同的。我在我的代码中使用了 Blob,应用程序加载速度很慢,因为它必须选择存储在 Blob 中的图像并逐个像素地转换它。我想使用字节数组,但我不知道它们是相同还是不同。我的主要目标是更快地加载图像。 谢谢

【问题讨论】:

如何不使用使用 BLOB(二进制大对象)将byte[] 存储在数据库中? BLOB(二进制大对象)`。这是 SQL 存储字节数组的方式。 ***.com/questions/6662432/… - 最好使用 BLOB 字节数组。 ByteArrayInputStrean - ImageIO.read。这不应该造成任何问题。 (虽然我更喜欢文件系统上的文件。) 我想知道字节和二进制有没有区别 一个字节是八位二进制。在这种情况下,它们实际上是相同的。 【参考方案1】:

在继续深入之前,我们可能需要记住有关位、字节和二进制、BLOB 的基本概念。

Bit:二进制数字的缩写。它是最小的存储单元。位可以取值 0 或 1。

字节:通常使用的第二小的存储(半字节未提及,因为它不是很常见的术语)。它包括八位。

Binary:实际上是一种编号方案,数字的每个数字都可以取值 0 或 1。

BLOB:存储在数据库中的二进制数据集。另外,存储二进制数据的列的类型。

总结定义:二进制格式是一种包含位的方案。

为了更具体,我们可以用下面的代码观察结果。

import java.nio.ByteBuffer;

public class TestByteAndBinary

     public static void main(String []args)
        String s = "test"; //a string, series of chars
        System.out.println(s);

        System.out.println();

        byte[] bytes = s.getBytes(); //since each char has a size of 1 byte, we will have an array which has 4 elements
        for(byte b : bytes)
            System.out.println(b);
         

        System.out.println();

        for(byte b : bytes)
            String c = String.format("%8s", Integer.toBinaryString(b)).replace(' ', '0'); //each element is printed in its binary format
            System.out.println(c);
        
     

输出:

$javac TestByteAndBinary.java
$java -Xmx128M -Xms16M TestByteAndBinary
test

116
101
115
116

01110100
01100101
01110011
01110100

让我们回到问题: 如果你真的想在数据库中存储一张图片,你必须使用 BLOB 类型。

但是!这不是最佳做法。

因为数据库是为存储数据而设计的,而文件系统是 设计用于存储文件。

从磁盘读取图像是一件简单的事情。但是从 数据库需要更多时间来完成(查询数据, 转换为数组,反之亦然)。

在读取图像时,会导致数据库受损 性能较低,因为它不是简单的文本或数字读取。

图像文件不会受益于数据库的特征(如索引)

此时,最好将该图像存储在服务器上并将其路径存储在数据库中。

据我所知,在企业级项目中,图像很少存储在数据库中。正是这些图像需要加密存储,因为它们包含非常性感的数据。根据我的拙见,即使在那种情况下,这些数据也不必存储在数据库中。

【讨论】:

【参考方案2】:

Blob 仅表示(二进制大对象)及其数据库存储字节数组的方式。

希望这很简单,它回答了你的问题。

【讨论】:

以上是关于以字节数组和二进制 (BLOB) 存储图像之间的区别以及哪个更快的主要内容,如果未能解决你的问题,请参考以下文章

将blob图像转换为数组以显示在spring mvc的网页中

如何将字节数组(即 byte[])保存到 Azure Blob 存储?

mysql bolb对应java啥类型

使用 Blob 在 SQLite 中存储字节数组

mysql使用blob存储base64格式文件

mysql