【问题标题】:SQL blob data becoming escaped causing max_allowed_packet errorSQL blob 数据被转义导致 max_allowed_pa​​cket 错误
【发布时间】:2015-07-04 01:25:45
【问题描述】:

我正在尝试将二进制数据作为 blob 存储在 MySQL 表中。我知道我的服务器配置为max_allowed_packet 大小为 1M,因此我将数据分块为 1M 的 blob。但是我仍然看到这样的错误:

异常:查询数据包太大 (1851203 > 1048576)。你可以 通过设置 max_allowed_pa​​cket' 在服务器上更改此值 变量。

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

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

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

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

有没有更好的方法?我应该在分块之前预先转义我的数据吗?

【问题讨论】:

  • 您正在使用setBlobInputStream
  • @JoopEggen 我目前正在使用setBlob(int parameterIndex, Blob x)
  • 数据示例 (0000) 建议首先进行压缩,但我怀疑您是否可以使用它。 Blob 是 PITA;例如考虑数据库备份(和恢复)。
  • 我刚刚尝试使用setBlob(int parameterIndex, InputStream x) 并得到了同样的错误。
  • 当 java 驱动程序向数据库发送完整的 SQL 时,几乎可以预料到。如今,数据库引擎也可以保留 real 本机准备好的语句。最可靠的似乎将 blob 存储在文件系统上作为 blob-record-id = filename。可惜了。

标签: java mysql jdbc


【解决方案1】:

我需要做两件事:

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

【讨论】:

    猜你喜欢
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 2016-11-01
    • 2023-02-13
    • 2010-09-10
    • 2017-05-14
    相关资源
    最近更新 更多