我可以在 MySQL 中存储图像吗[重复]
Posted
技术标签:
【中文标题】我可以在 MySQL 中存储图像吗[重复]【英文标题】:Can I store images in MySQL [duplicate] 【发布时间】:2011-09-22 06:26:36 【问题描述】:可能的重复:Images in mysqlStoring images in MySQL
我正在尝试开发一个网站,用户可以在其中上传他们的图片作为注册的一部分。我希望对于每个图像,都应该有一个用 php 创建的拇指(这并不难)。我想将拇指(因为它们非常小)保存在数据库中,我使用 MySQL。 (我不想将拇指保存为驱动器上的物理文件。) MySQL 是否允许保存和检索图像数据,我该怎么做?如果它不支持图像数据,是否有任何免费的数据库支持?如果可以提供链接,我会很高兴。 谢谢。
【问题讨论】:
php-mysql-tutorial.com/wikis/mysql-tutorials/… ***.com/questions/3014578/storing-images-in-mysql 和 ***.com/questions/1665730/images-in-mysql 和 ***.com/questions/1257488/… 的副本 是的,但它不是最佳的!所以....不,不要这样做! 谷歌“mysql php blob 示例”,你会发现很多帮助。 和***.com/questions/2753193/… 和***.com/questions/4133558/… 和***.com/questions/5380699/mysql-works-with-images ... 【参考方案1】:是的,您可以将图像存储在数据库中,但我认为这是不可取的,也不是一般做法。
一般做法是将图像存储在文件系统的目录中,并将对图像的引用存储在数据库中。例如图像的路径、图像名称等。或者,您甚至可以将图像存储在内容交付网络 (CDN) 或跨越一些巨大物理区域的众多主机上,并将访问这些资源的引用存储在数据库中。
图像可以变得非常大,超过 1MB。因此,将图像存储在数据库中可能会给数据库以及数据库和 Web 服务器之间的网络(如果它们位于不同的主机上)带来不必要的负载。
我曾在拥有 40 万多名员工的初创公司、中型公司和大型科技公司工作过。在我 13 年的专业经验中,我从未见过有人将图像存储在数据库中。我这样说是为了支持这种说法,这是一种不常见的做法。
【讨论】:
哈哈,别吓唬人了。我不知道 2011 年的情况如何,但现在数据库得到了如此改进,并且将 blob 列与普通数据分开存储,你永远不会注意到速度的变化。甚至还有streamline
您能否提供具体的论据来反对将图像存储在数据库中或导致问题的案例示例?我同意你的意见,但我希望能够在讨论中提供事实。
这个答案肯定太没有区别和笼统,无法获得如此多的支持。也有关于这个问题的论文,将图像存储在数据库中当然不是坏习惯。在 Bill Karwins 的书“SQL Antipatterns”中也有一章介绍了这一点。将图像存储在数据库中几乎总是一个好主意,如果您不希望 dbms 内存爆炸(由于特殊处理(流...)无论如何都不会发生,您可以将图像缓存在文件系统上,这是微不足道的(更新时:删除文件)。
“不要将图像存储在数据库中”只是另一个错误的概括,就像这个本身一样。好吧,将所有公共成员的照片/头像存储在数据库中可能不是一个好主意,但是假设您只想存储您的员工照片,并且您有
你给出的建议真的很糟糕。 Facebook 做了我所描述的事情以及其他存储大量图像的网站。只需快速谷歌一下。 code.facebook.com/posts/685565858139515/… 它根本没有存储在数据库中。他们使用网络文件存储系统。这不是一个新问题。它已通过文件系统反复解决。只需谷歌图片网站如何存储他们的图片。【参考方案2】:
您需要保存为 blob,mysql 中的 LONGBLOB 数据类型可以使用。
例如:
CREATE TABLE 'test'.'pic' (
'idpic' INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
'caption' VARCHAR(45) NOT NULL,
'img' LONGBLOB NOT NULL,
PRIMARY KEY ('idpic')
)
正如其他人所说,这是一种不好的做法,但可以做到。不过,不确定这段代码是否能很好地扩展。
【讨论】:
我需要 (MariaDb) 来更改 ` (inverted) 的引号【参考方案3】:您可以在 MySQL 中将图像存储为 blob。但是,由于以下几个原因,这是有问题的:
图像可能更难操作:您必须先从数据库中检索它们,然后才能执行批量操作。 除了极少数情况下整个数据库都存储在 RAM 中,MySQL 数据库最终都存储在磁盘上。这意味着您的数据库图像被转换为 blob,插入到数据库中,然后存储在磁盘上;您只需将它们存储在磁盘上即可节省大量开销。相反,请考虑更新您的表以添加 image_path 字段。例如:
ALTER TABLE `your_table`
ADD COLUMN `image_path` varchar(1024)
然后将图像存储在磁盘上,并使用图像路径更新表。当您需要使用图像时,请使用指定的路径从磁盘中检索它们。
这种方法的一个有利副作用是图像不一定存储在磁盘上;您可以轻松地存储 URL 而不是图像路径,并从任何连接互联网的位置检索图像。
【讨论】:
George,如果图像不应该公开,您还会提倡这种方法吗? @AnthonyRutledge 是的。数据库存储的开销并没有提供任何额外的安全选项。访问控制很容易通过 web 服务器、文件系统权限、将文件放在 web 服务器路径之外等来处理。 说我接受你的结论是有效和合理的。如果您正在构建与电子商务相关的内容管理系统(用于可下载的数字内容,如学术期刊),您还会提倡这种方法吗?存储路径需要您手动(或以编程方式)维护数据库和文件系统之间的并行关联。在数据库中存储文件将文件数据耦合到数据库,但它不需要保持存储路径与文件系统同步的工作。由于无需担心路径,因此可下载内容的曝光率较低。 也就是说,即使可以将图像之类的东西放在网络根目录之外,您仍然需要对其进行管理。你可以这样做,或者数据库可以。我将不得不进行更多调查。 我认为比尔·卡尔文的回答很有价值。 quora.com/…【参考方案4】:您需要将图像作为 BLOB 存储在数据库中。
您需要在表中创建一个名为 PHOTO 的列并将其设置为 mediumblob。
然后你会想像这样从表单中获取它:
$data = file_get_contents($_FILES['photo']['tmp_name']);
然后将该列设置为 $data 中的值。
当然,这是不好的做法,您可能希望使用与用户帐户对应的名称将文件存储在系统上。
【讨论】:
你能告诉我如何创建一个像 medium.com 这样的博客,其中图像包含在文本中并保留它们的顺序吗?文本的内容类型也是 html。以上是关于我可以在 MySQL 中存储图像吗[重复]的主要内容,如果未能解决你的问题,请参考以下文章