最近,我收到一个使用 MySQL 5.6 的旧应用程序,它在处理大文件时存在问题。
我发现很多帖子都说 max_allowed_packet 不能设置为超过 1GB,因为这是 MySQL 定义的限制。但是有一种数据类型 LONGBLOB 被定义为支持最大 4GB 的大小。
我无法想象,他们定义了一种你无法使用的数据类型——尽管max_allowed_packet是1GB,怎么可能保存这种大小的Blob呢?
答案1
唯一的方法是将要上传的 blob 拆分为大小相等或更小的块max_allowed_packet
。它们通过多次调用 MySQL C API 函数进行上传mysql_stmt_send_long_data()
(qv)。MySQL 命令行客户端应该会为您处理这个问题。在您自己的代码中,您可能需要检查您首选语言的 API 是否处理这个问题,或者您是否必须自己处理这个问题。
答案2
有很多的实际的不尝试使用全部 4GB 的原因。
- 执行查询需要很长时间。* 慢
- 如果明天的 blob 长度为 5GB 怎么办?
- 它会阻塞复制。
- 对于图像/视频之类的东西,最好将 blob 放在文件中,然后让 html 通过
<img...>
(等)处理它。 - 杂乱的 RAM(可能更适合用于缓存等)
无论如何,您只是损失了 1G 和 4G 之间的范围。16M..1G 可以工作;小于 16M 也可以工作(以及MEDIUMBLOB
等)。