MessagePackとは、オブジェクトをシリアライズしたり、それを戻したりする事が出来るライブラリの一つです。
MessagePack
今回は、このMessagePackでpackしたデータをMySQL上にどうすれば保存出来るのか?を紹介したいと思います。
連想配列などをMessagePackを使ってシリアライズするコードは以下のようになります。
$pack = msgpack_pack($value);
上記の戻り値$packは、一見はただの文字列なので、あまり深く考えずに、text型のカラムに放り込めばいいんじゃないの?と思うんですが、それだと以下のようなMySQLのエラーになってしまいます。
General error: 1366 Incorrect string value: ~省略~
エラー内容で調べると、文字コードがutf8ではない場合等に発生するエラーらしいのですが、PHPのmb_detect_encoding()という関数で調べたら、文字コード自体はutf8と判断されている模様。
そもそも、別にtext型ではなくとも、保存して取り出して復元出来ればOK・・・。
という事で、text型ではなく、バイナリ型のカラムであれば保存可能です。
MySQLでバイナリを扱うカラムといえばbinary、varbinary、blobといくつかあるようですが、適切なサイズが設定されていないと、サイズ不足でエラーになります。
MessagePackでパックした後の文字列長が不定であれば、blob型がよいかと思います。
連想配列やstdClass型の情報をMessagePack形式にしてDBに保存しておけば、後で必要なときにDBから取り出して以下のコードで復元して使える事になります。
$value = msgpack_unpack($pack);
色々な情報を保存したいけど、別に検索条件に使うわけでもないし、一つ一つをテーブルにカラム追加していくのは面倒だな・・・的な情報は、個別のカラムに持たせるまでもなく、ひとまとめにして管理しておく事が可能になります。