MySQL で数Mバイト程度の大きなデータを保存するための覚書。
$sth = $dbh->prepare ('INSERT INTO `foo` (column) VALUES (?)');
$sth->bind_param (1, $large_data);
$ret = $sth->execute
or die $dbh->errstr;
$large_data が数Mバイトを超えるデータの場合、$sth->execute の時点で、パケットサイズが大きすぎる旨のエラーが表示される。一度にやり取りできるデータサイズ max_allowed_packet は SQL の SHOW VARIABLES で調べることができます。
SHOW VARIABLES LIKE "max_allowed_packet"
さくらインターネットのレンタルサーバで稼動している MySQL サーバの場合 4M。
max_allowed_packet を変更するには、1) my.cnf 設定ファイルを変更するか、2) デーモン起動の際のオプションで指定できるが、レンタルサーバなのでそういうわけにもいかない(´・ω・`)
大きなデータは max_allowed_packet 以下のサイズに分割して、複数のエントリとして保存するくらいしかできないのかな?
my $large_data = 'a large data...';
my $packet_size = 4096 * 1024 * 1024;
for (my $loop_flag = 1; $loop_flag; ) {
my $write_data;
if ($packet_size < length $large_data) {
$write_data = substr $large_data, 0, $packet_size;
$large_data = substr $large_data, $packet_size;
} else {
$write_data = $large_data;
$loop_flag = 0;
}
;# Insert $write_data into database
}