4,464 views
この記事は最終更新から 2229日 が経過しています。
(1) やりたいこと
PHPプログラム上の複雑なデータ構造を、DBに保存したい。
でも…
個々のメンバ変数について、個々にカラムを作るのは面倒だ。
複雑なデータを、1個のカラムにまとめて保存したい。
↓
シリアライズして保存すればよい!
(2) やってみる
1. まずはシリアライズしてみる。
クラスのインスタンスに対して serialize() でシリアライズし、unserialize() で戻す。
class CAaa { private $m_text; private $m_int; private $m_array; function __construct( $text, $int, $array ){ $this->m_text = $text; $this->m_int = $int; $this->m_array = $array; } } $caaa = new CAaa("hello", 1234, array(1,2,3,4,5)); var_dump($caaa); echo "<hr>"; $bin_txt = serialize($caaa); var_dump($bin_txt); echo "<hr>"; $caaa2 = unserialize($bin_txt); var_dump($caaa2);
実行結果は以下の通り。
https://www.dogrow.net/php/sample/00051/test1.php
シリアライズしたデータが正しく復元できている。
2. シリアライズしたデータをDB保存する。
以下のPHP公式ページには、シリアライズしたデータのDB保存について注意書きがある。
http://php.net/manual/ja/function.serialize.php
serialize() の出力をデータベースに格納するときには、 通常は CHAR 型や TEXT 型ではなく BLOB 型を使わないといけません。
すなわち…
シリアライズしたデータを保存するためのカラムを作る時は BLOB 型でなければならない。
また、BLOBには以下のようにサイズの制約があるので注意すること。
大きなデータを TINYBLOB型のカラムに保存すれば溢れてしまう。
・TINYBLOB : ~255[byte]
・BLOB : ~64KB
・MEDIUMBLOB : ~16MB
・LONGBLOB : ~4GB