【发布时间】:2015-07-04 01:25:45
【问题描述】:
我正在尝试将二进制数据作为 blob 存储在 MySQL 表中。我知道我的服务器配置为max_allowed_packet 大小为 1M,因此我将数据分块为 1M 的 blob。但是我仍然看到这样的错误:
异常:查询数据包太大 (1851203 > 1048576)。你可以 通过设置 max_allowed_packet' 在服务器上更改此值 变量。
似乎正在发生的是PreparedStatement 正在转义我的分块 blob 中的数据。
例如blob 0000 将作为 \0\0\0\0 发送。
因此,在最坏的情况下,数据大小可能会增加一倍,从而导致错误。
我唯一的想法是将数据分块为max_allowed_packet 大小的一半,以便为潜在的转义字符留出空间。
有没有更好的方法?我应该在分块之前预先转义我的数据吗?
【问题讨论】:
-
您正在使用
setBlob和InputStream? -
@JoopEggen 我目前正在使用
setBlob(int parameterIndex, Blob x) -
数据示例 (0000) 建议首先进行压缩,但我怀疑您是否可以使用它。 Blob 是 PITA;例如考虑数据库备份(和恢复)。
-
我刚刚尝试使用
setBlob(int parameterIndex, InputStream x)并得到了同样的错误。 -
当 java 驱动程序向数据库发送完整的 SQL 时,几乎可以预料到。如今,数据库引擎也可以保留 real 本机准备好的语句。最可靠的似乎将 blob 存储在文件系统上作为 blob-record-id = filename。可惜了。