- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我对 MySQL 中的 blob
数据类型有疑问。
我读到数据类型可以用来存储文件。我还读到另一种方法是将文件存储在磁盘上,并包含一个指向它在数据库中的位置的指针(通过 varchar 列)。
但我有点困惑,因为我读到 blob 字段没有存储在行中,需要单独查找才能检索其内容。那么这与在文件系统上存储指向文件的指针有什么不同吗?
最佳答案
I read that the data type can be used to store files.
根据MySQL manual在 Blob 上的页面中,BLOB
是一个二进制大对象,可以容纳可变数量的数据。
由于它是一种特定于存储二进制数据的数据类型,因此通常使用它来存储二进制格式的文件,在 Web 应用程序中存储图像文件是一种非常常见的用途。
对于 Web 应用程序,这意味着您首先需要将文件转换为二进制格式,然后将其存储,并且每次需要检索文件时,您都需要执行将它们转换回原始文件的相反过程格式。
除此之外,在您的数据库中存储大量数据可能会减慢它的速度。特别是在不仅仅用于托管数据库的系统中。
I also read that an alternative is to store the file on disk and include a pointer to its location in the database
考虑到上述所有因素,Web 应用程序的一个常见做法是将文件存储在 MySQL 以外的其他位置,然后简单地将其路径存储在数据库中。这种方法可以在处理大量数据时加快您的数据库。
But I'm a little confused because I've read that blob fields are not stored in-row and require a separate look-up to retrieve its contents.
事实上,这取决于您使用的存储引擎,因为每个引擎都以不同的方式处理和存储数据。对于适用于关系数据库的 InnoDB 引擎,您可能需要从 MySQL Performance blog 阅读这篇文章关于 blob 如何存储在 MySQL 中。
但抽象地说,在 MySQL 5 及更高版本上,blob 存储如下:
Innodb stores either whole blob on the row page or only 20 bytes BLOB pointer giving preference to smaller columns to be stored on the page, which is reasonable as you can store more of them.
所以您现在可能认为正确的方法是将它们存储为单独的文件,但是使用 blob 存储数据有一些优点,第一个(在我看来)是备份。我管理着一台小型服务器,我不得不创建另一个子例程,只是为了将作为路径存储的文件复制到另一个存储磁盘(我们买不起像样的磁带备份系统)。如果我将应用程序设计为使用 blob,那么一个简单的 mysqldump
将是我备份整个数据库所需的一切。
为备份存储 blob 的优势在 this post 上有更好的讨论。回答的人和我有类似的问题。
另一个优点是安全性和易于管理权限和访问。 MySQL 服务器中的所有数据都受密码保护,您可以轻松地为用户管理权限,了解谁可以访问什么,谁不可以访问。
在依赖 MySQL 权限系统进行身份验证和使用的应用程序中。这肯定是一个优点,因为对于入侵者来说,从您的磁盘或没有访问权限的用户检索图像(或压缩文件等二进制文件)会有点困难。
所以我会这么说
如果您要管理 MySQL 和其中的所有数据,并且必须定期备份或打算更改甚至考虑将来更改操作系统,并且拥有不错的硬件并针对它优化了 MySQL,请选择 BLOB .
如果您不会管理您的 MySQL(例如在网络主机中)并且不打算更改操作系统或进行备份,请坚持使用 varchar
列指向到您的文件中。
我希望它有所帮助。干杯
关于mysql - 在 blob 中存储数据与存储指向文件的指针之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13435187/
有人能给我解释一下我下面程序中的一点吗我编写的以下程序是为了理解 int * const * var 的含义; #include "iostream" using namespace std ; in
我正在摆弄 C 中的指针,但仍然不确定一些非常基础的知识。我想出了以下示例代码: #include int main(void) { int num = 42; /
以下代码产生警告: const char * mystr = "\r\nHello"; void send_str(char * str); void main(void){ send_str
我正在尝试在我的 Linux 计算机上升级 cmake。这是我使用的命令。 删除旧的 cmake: sudo apt purge --auto-remove cmake 从 https://cmake
我试图借助 char 指针来追踪 union 第一个字节的值。我假设 byte1 的输出应该是 ff,但实际上是 ffffffff。如果我错了请纠正我。 #include #include #in
我正在使用微 Controller 进行一些 ADC 测量。当我尝试使用 -O2 优化编译以下代码时遇到问题,当代码中存在 PrintVal() 函数时,MCU 卡住。我做了一些调试,结果发现,当我添
#include #include using namespace std; int main () { vector qwerty; qwerty.push_back(5);
我有我的 woking setup.py 文件;其中包含以下行: home = os.environ["HOME"] # home = /home/dr in my machine; distu
这段代码 #include #include static_assert(std::is_same_v::value_type, volatile int>); 在最新的 GCC 和 clang
我对 C 中的前向声明有疑问。 代码 typedef struct yhash_s t_yhash;// forward declaration struct yhash_s { size_t
我想提取成员指针指向的成员的类型。 template void demo(myClass& instance, void* ptr) { instance.*member = *reinter
我正在尝试使用指针将一段 C 代码转换为 Swift 3。这是 C 代码中的相关部分。 Float32 sampleArray[256] = { // Array is 256 Float value
您可能知道,VLA's haves pros and cons 和它们在 C11 中是可选的。 我想使 VLA 成为可选项的主要原因是:“堆栈可能会爆炸”: int arr[n]; /* where
这段代码有什么错误?为什么我不能按照我尝试的方式取消引用该元素。 #include typedef struct { int value; struct node * left;
有什么方法可以在 JavaScript 中创建\返回指向变量的指针吗? 比如,在 PHP 中: function func() { ..... return &$result; } 我
如果您想使用方法的指针作为参数,则需要将该方法键入作为对象的函数,就像这样好 : type TAcceptor = function(filename:string):boolean of objec
很简单的问题: 我对 C++ 中的智能指针有点陌生。我想我得到了所有权的东西,但我不知道如何访问他们实际指向的内容。当我尝试使用对象的成员函数/变量时,我只是得到了 unique_ptr 类的函数,这
我得到了一个点的方位 Angular 、指南针方向和一个可以将箭头设置到某个方向的 api(0 是顶部,90 是右侧,180 是底部,360 是顶部) 如果我希望箭头指向我采用方位 Angular 形
我正在尝试找到一种方法,从单元格中获取位于当前工作表左侧(托盘下方)的工作表单元格中的数据。 我知道如何通过调用其他工作表 =Sheet1!A1 但现在我需要一些最好的解释 =Sheet[-1]!A1
所以我在 MATLAB 中有一个 for 循环,其中向量 x 将通过一个函数,比如 cos(x).^2,或者不同的选择,比如 sin(x).^2 + 9.*x。用户将在 for 循环之前选择他想使用的
我是一名优秀的程序员,十分优秀!