2010-09-20 33 views
6

我知道要將大於max_allowed_packet字節的值插入MySQL數據庫,默認解決方案是確保客戶端和服務器端max_allowed_packet變量大於查詢插入數據庫的數據塊。有沒有辦法在不改變max_allowed_pa​​cket的情況下在mysql數據庫中插入大數值?

但是,有沒有辦法做到這一點沒有改變上面提到的服務器端變量?當我必須將數據插入在ISP中託管的數據庫時,這不會允許我更改max_allowed_packet限制,這非常有用。

另一個相關問題:MySql longblob限制爲4GB,但max_allowed_packet限制爲1GB。那麼,是否可以在longblob表列中插入大於1GB的值?

回答

11

我最近偶然發現了這個問題。在我的情況下,服務器的max_allowed_packet是1 MB,我無法改變它。我插入的數據剛好在1 MB以上。我找到兩個解決方案候選人

1)首先,使用JDBC。 由於MySQL連接/ J v3.1.9,還有,你可以設置一些參數,這是我的一套在JDBC URL參數:

附加這些:

blobSendChunkSize=50000&useServerPrepStmts=true&emulateUnsupportedPstmts=false&maxAllowedPacket=20000000 

在JDBC URL所得:

jdbc:mysql://serverip:3306/databasename?noDatetimeStringSync=true&blobSendChunkSize=50000&useServerPrepStmts=true&emulateUnsupportedPstmts=false&maxAllowedPacket=20000000 

則必須使用PreparedStatement做你的插入,然後使用InputStream到字節的內容作爲參數傳遞給setObject。請注意,setObject使用字節數組將不會啓用blob分割。參數組合,最近的MySQL服務器(5.0.45或更高版本)和InputStream將使用LONG DATA機制發送blob數據,根據blobSendChunkSize拆分blob。

JDBC解決方案的工作原理和我已經測試過。

2)現在,第二個候選人,是使用PHP的mysqli驅動程序和使用mysqli_send_long_data。爲了您的方便,複製自PHP手冊示例:

<?php 
$stmt = $mysqli->prepare("INSERT INTO messages (message) VALUES (?)"); 
$null = NULL; 
$stmt->bind_param("b", $null); 
$fp = fopen("messages.txt", "r"); 
while (!feof($fp)) { 
    $stmt->send_long_data(0, fread($fp, 8192)); 
} 
fclose($fp); 
$stmt->execute(); 
?> 
+1

剛試過mysqli在1mb max_allowed_pa​​cket上存儲27mb文件。真棒回答,我們一直在爲此工作近一週。 – shmeeps 2011-08-19 19:47:46

+0

不可能僅爲當前事務/連接設置這些參數嗎?也許使用'SET ...'?我更喜歡這改變JDBC URL。 – 2015-09-09 13:53:43

+0

加入這兩個參數useServerPrepStmts = true&maxAllowedPacket = 20000000時效果很好。我看到'java.sql.SQLException:通過mysql_send_long_data()設置的準備語句的參數比'max_allowed_pa​​cket'字節'長,當我使用blobSendChunkSize時這很奇怪。 – Rishi 2017-08-03 23:52:57

-1

我不認爲有辦法。也許分裂blob會做伎倆。

但我認爲從Reymond Chen讀這篇文章http://blogs.msdn.com/b/oldnewthing/archive/2007/03/01/1775759.aspx是對您的問題的最佳答案。

關係數據庫不是爲那種用途而設計的。如果您需要在數據庫中存儲千兆字節+ blob,那麼通常最好將其存儲在NFS上,並在數據庫中只包含一個簡短的文件位置字符串。將會爲您節省很多麻煩。

+0

我的第二個問題更多的是好奇心,主要問題是第一個問題。我不打算在一個專欄中放置一個3GB的blob ......我認爲我的第一個問題不涉及違反操作系統限制。我的意思是,當我無法更改此變量時,將一個2MB Blob放入max_allowed_pa​​cket僅爲1MB的數據庫中會很有用... – 2010-09-22 18:43:06

相關問題