4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

MessagePack形式のデータをMySQLに保存する方法

Posted at

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);

色々な情報を保存したいけど、別に検索条件に使うわけでもないし、一つ一つをテーブルにカラム追加していくのは面倒だな・・・的な情報は、個別のカラムに持たせるまでもなく、ひとまとめにして管理しておく事が可能になります。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?