2015-07-03 56 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(我的情況不需要其他屬性)。