MySQL 类型LONGTEXT
和LONGBLOB
记录的数据限制为 L + 4 字节,其中 L < 2^32 (~4GB)。但是,max_allowed_packet
是只可配置高达1GB。
可以传输到 MySQL 8.0 服务器或客户端或从 MySQL 8.0 服务器或客户端传输的最大可能数据包为 1GB。
这不是意味着 LONGTEXT 和 LONGBLOG 的限制实际上是 ~1GB 吗?该JSON类型由有限max_allowed_packet
但文本/ BLOB类型不提相同的限制。有没有办法处理这些类型(可能是片段)以在数据包限制内工作?
注意:我知道出于性能和设计原因,不鼓励在 DB 列中存储大于 1MB 的数据。我只是想知道如果需要的话,我如何在 TEXT/BLOB 中存储或检索超过 1GB 的数据。
在这份MySQL 错误报告中,验证团队的一名成员回应道:
通过使用带有准备好的语句的块可以轻松解决这个问题。我们的一些客户端程序确实支持此功能。
因此,作为一个简单的分块解决方案,我们可以尝试以下方法:
INSERT INTO table1 (bigcol) VALUES (@chunk1);
SET @id := last_insert_id();
UPDATE table1 SET bigcol = concat(bigcol, @chunk2) WHERE id = @id;
UPDATE table1 SET bigcol = concat(bigcol, @chunk3) WHERE id = @id;
UPDATE table1 SET bigcol = concat(bigcol, @chunk4) WHERE id = @id;
Run Code Online (Sandbox Code Playgroud)
我已经使用较小的值 1024max_allowed_packet
和每个块的相同大小对此进行了测试。它不起作用,至少如果您使用mariadb
命令行客户端则不起作用,所以想必与客户端相同mysql
。每个都UPDATE
失败:
错误 1301 (HY000):concat() 的结果大于 max_allowed_packet (1024) - 被截断
如果我们使用准备好的语句,那没有什么区别。
然而,如果使用 C API,有一种mysql_stmt_send_long_data()
由MySQL和MariaDB记录的方法,它可以为您分块数据并避免限制。
所以,你已经知道了 - 有一种方法可以做到这一点,但命令行客户端不支持它。