将图像直接存储在数据库中或作为base64数据存储?
将图像存储在数据库中的常用方法是在存储数据之前将图像转换为base64
数据。 这个过程将增加33%的大小。 或者,可以将图像直接存储为BLOB
; 例如:
$image = new Imagick("image.jpg"); $data = $image->getImageBlob(); $data = $mysqli->real_escape_string($data); $mysqli->query("INSERT INTO images (data) VALUES ('$data')");
然后显示图像
<img src="data:image/jpeg;base64,' . base64_encode($data) . '" />
采用后一种方法,我们节省了1/3的存储空间。 为什么在MySQL数据库中将图像存储为base64
更为常见?
更新:关于在数据库中存储图像的优点和缺点有许多争论,大多数人认为这不是一个实际的方法。 无论如何,在这里我假设我们将图像存储在数据库中,并讨论这样做的最佳方法。
Pro base64:你处理的编码表示是一个非常安全的string。 它既不包含控制字符也不包含引号。 后一点有助于防止SQL注入尝试。 我不希望任何问题只是将值添加到“手动编码的”SQL查询string。
Pro BLOB:数据库pipe理器软件知道它所期望的数据types。 它可以优化。 如果将base64存储在TEXT字段中,它可能会尝试为它创build一些索引或其他数据结构,这对于“真实”的文本数据来说是非常好的和有用的,但却毫无意义,浪费了图像数据的时间和空间。 而且这个字节的数量越less越好。
我争辩说,图像(文件)通常不存储在数据库base64编码。 相反,它们以原始二进制forms存储在二进制(blob)列(或文件)中。
Base64仅用作传输机制,不用于存储。 例如,您可以将base64编码的图像embedded到XML文档或电子邮件中。
Base64也是stream友好的。 您可以即时编码和解码(不知道数据的总大小)。
虽然base64是适合运输, 不要存储您的图像base64编码 。
Base64不提供校验和或任何有价值的存储。
Base64编码比原始二进制格式增加了33%的存储需求。 这也增加了必须从持久存储中读取的数据量,这仍然是计算中最大的瓶颈。 读取较less的字节并对其进行编码通常会更快。 只有当你的系统是CPU绑定而不是IO绑定,并且你经常以base64输出图像时,考虑以base64存储。
embedded式图像(embedded在HTML中的base64编码图像)本身就是一个瓶颈 – 通过networking传输33%的数据,然后连续执行(网页浏览器必须等待内嵌图像才能完成下载页面HTML)。
如果你仍然希望存储base64编码的图像,不pipe你做什么,请确保你不把base64编码的数据存储在UTF8列中,然后索引它。
我build议看看像NoSQL这样的现代化数据库,我同意user1252434的文章。 例如,我在Mongo数据库中存储了几个<500kb的PNG作为base64,二进制设置为true,没有任何性能问题。 Mongo可以用来存储大文件,比如10MBvideo,并且可以在这些video的元数据search中提供巨大的时间节省优势,请参阅以mongodb存储大型对象和文件 。