2010-09-20 53 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

相关问题