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 }