我可以在MySQL中存储图像吗?

afa*_*lek 119 php mysql image

可能重复:
MySQL中的图像在MySQL中
存储图像

我正在尝试开发一个网站,用户上传他们的图像作为注册的一部分.我希望每个图像都应该有一个用PHP创建的拇指(这并不困难).我想在数据库中保存拇指(因为它们非常小),我使用MySQL.(我不想将拇指保存为驱动器上的物理文件.)
MySQL是否允许保存和检索图像数据,我该如何处理?如果它不支持图像数据,是否有任何免费的数据库呢?如果可以提供链接,我会很高兴.
谢谢.

Fin*_*orm 239

是的,您可以将图像存储在数据库中,但在我看来这是不可取的,这不是一般的做法.

通常的做法是将图像存储在文件系统上的目录中,并存储对数据库中图像的引用.例如,图像的路径,图像名称等.或者,您甚至可以将图像存储在内容传送网络(CDN)或跨越一大片物理区域的众多主机上,并存储引用以访问数据库中的这些资源. .

图像可以变得非常大,大于1MB.因此,将数据存储在数据库中可能会对数据库和数据库与Web服务器之间的网络造成不必要的负担,如果它们位于不同的主机上.

我曾在拥有400,000多名员工的创业公司,中型公司和大型科技公司工作过.在我13年的专业经验中,我从未见过有人将图像存储在数据库中.我这样说是为了支持这种说法,这是一种不寻常的做法.

  • 哈哈,不要只是吓唬人.我不知道它是如何在2011年,但现在数据库是如此改进和存储blob列与正常数据分开,你永远不会注意到速度的变化.甚至还有"流线型" (30认同)
  • 这个答案当然太过于无差别和通用,无法获得如此多的赞成.还有关于这个问题的论文,将图像存储在数据库中通常不是一种不好的做法.在Bill Karwins的书中,"SQL Antipatterns"也是关于此的一章.如果您不希望dbms内存爆炸(这不会因为特殊处理(流...)而无法发生,您可以将图像缓存在文件系统上,将数据存储在数据库中几乎总是一个好主意,这是微不足道的(更新时:删除文件). (9认同)
  • 您是否可以再次提供在数据库中存储图像的具体参数或导致问题的案例示例?我赞同你的意见,但我希望能够在讨论中提供事实. (4认同)
  • "不要将图像存储在数据库中"只是另一种错误的概括,就像这本身一样.那么,将所有公共成员照片/头像存储在数据库中可能不是一个好主意,但是假设您只想存储员工的照片而且您的<20名员工并且您不想设置Web服务器或某种类型"文件共享"以及您的应用程序支持远程管理.猜猜看,将图像存储在数据库中是您唯一的最佳镜头! (4认同)
  • 你提出了非常糟糕的建议.Facebook做我正在描述的和其他存储大量图像的网站.只需快速谷歌.https://code.facebook.com/posts/685565858139515/needle-in-a-haystack-efficient-storage-of-billions-of-photos/它根本没有存储在数据库中.他们使用网络文件存储系统.这不是一个新问题.它已经使用文件系统重复解决.只是谷歌图像网站如何存储他们的图像. (3认同)
  • 这篇文章是在5年前...我继续编辑这篇文章,以便它更合适和更现代.我给出了额外的合理化,为什么将图像存储在数据库中可能是不合适的. (2认同)

dev*_*oug 38

你需要保存为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')
)
Run Code Online (Sandbox Code Playgroud)

正如其他人所说,这是一种不好的做法,但可以做到.但是不确定这段代码是否可以很好地扩展.


Geo*_*ins 14

您可以将图像存储在MySQL中作为blob.但是,由于以下几个原因,这是有问题的:

  • 图像可能难以操作:必须先从数据库中检索它们,然后才能执行批量操作.
  • 除了在整个数据库存储在RAM中的极少数情况下,MySQL数据库最终存储在磁盘上.这意味着您的数据库映像将转换为blob,插入数据库,然后存储在磁盘上; 只需将它们存储在磁盘上即可节省大量开销.

相反,请考虑更新表以添加image_path字段.例如:

ALTER TABLE `your_table`
ADD COLUMN `image_path` varchar(1024)
Run Code Online (Sandbox Code Playgroud)

然后将图像存储在磁盘上,并使用图像路径更新表.需要使用图像时,使用指定的路径从磁盘检索图像.

这种方法的一个有利的副作用是图像不一定存储在磁盘上; 您可以轻松存储URL而不是图像路径,并从任何连接互联网的位置检索图像.


小智 5

您需要将图像作为BLOB存储在数据库中.

您需要在表中创建一个名为PHOTO的列,并将其设置为mediumblob.

那么你会希望从表单中得到它:

    $data = file_get_contents($_FILES['photo']['tmp_name']);
Run Code Online (Sandbox Code Playgroud)

然后将列设置为$ data中的值.

当然,这是不好的做法,您可能希望将文件存储在系统中,其名称与用户帐户相对应.