2015-07-03 37 views
0

我试图将二进制数据作为blob存储在MySQL表中。我知道我的服务器配置为max_allowed_packet大小为1M,因此我将数据分块为1M。但我仍然看到这样的错误:SQL blob数据变得越来越多导致max_allowed_pa​​cket错误

例外:用于查询的数据包太大(1851203> 1048576)。您可以通过设置max_allowed_pa​​cket' 变量, 在服务器上更改此值。

似乎正在发生的事情是PreparedStatement正在转义我的分块blob中的数据。

例如blob 0000将作为\0\0\0\0发送。

因此,在最坏的情况下,数据可能会导致错误的大小加倍。

我唯一的想法是将数据分块为max_allowed_packet大小的一半,为可能的转义字符留出空间。

有没有更好的方法?我应该在将数据分块之前预先逃脱我的数据?

+0

您正在使用'setBlob'和'InputStream'? –

+0

@JoopEggen我正在使用'setBlob(int parameterIndex,Blob x)' –

+0

数据示例(0000)会建议先压缩,但我怀疑你可以使用它。斑点是PITA;想想关于数据库备份(和恢复)的例子。 –

回答

0

我需要做两件事情:

  1. 使用PreparedStatement#setBlob(int parameterIndex, InputStream x),而不是setBlob(int parameterIndex, Blob x),作为@JoopEggen建议尝试。
  2. 并在Connection上设置属性useServerPrepStmts=true,如答案 https://stackoverflow.com/a/4846674/52176(我的情况不需要其他属性)。