由于 max_allowed_pa​​cket 被硬限制为 1GB,如何充分利用 MySQL 的 4GB 限制的数据类型?

jim*_*imp 5 mysql mariadb

MySQL 类型LONGTEXTLONGBLOB记录的数据限制为 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 的数据。

dbd*_*mon 1

在这份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_pa​​cket (1024) - 被截断

如果我们使用准备好的语句,那没有什么区别。

然而,如果使用 C API,有一种mysql_stmt_send_long_data()MySQLMariaDB记录的方法,它可以为您分块数据并避免限制。

所以,你已经知道了 - 有一种方法可以做到这一点,但命令行客户端不支持它。