シリアライズされたデータには値の他に型と長さ(byte)の情報が含まれています。
a:1:{i:0;s:24:"あしたは晴れです";}
a は配列で、続く数値は要素の数を表しています。
i は Integer型で、続く数値は byte ではなく値です。この場合、配列のキーにあたります。
s は String型で、続く数値は byte です。この場合、配列の値にあたります。
この文字列をアンシリアライズすると、
array(1) { [0]=> string(24) "あしたは晴れです" }
このようになります。
ここからが本題!
あしたは晴れですをあしたは雨ですに置き換えたとします。
a:1:{i:0;s:24:"あしたは雨です";}
マルチバイトはほとんど 3 bytes / 1文字なので、1文字減って 21 bytes に変わりましたが、長さを示す数値は 24 bytes のままです。
これをアンシリアライズすると、
Notice: unserialize(): Error at offset 39 of 39 bytes in YOUR DIR on line ** bool(false)
そらみたことか。false(偽)が返され、Notice(注意)が出てしまいました。
そうです、byte も正しい数値に変えないとならないのです。
WordPress を使っている場合、これは大きな問題になることがあります。
プラグインの中にはシリアライズされたデータを扱うものが数多く存在するので、安易に置き換えを行うと不具合が発生してしまいます。
WordPress で一括置換を行う場合はプラグインを利用すべきです。
おすすめプラグイン ――― Better Search Replace
なぜか Search Replace DB を推す記事が多くみられますが、WordPress の公式ディレクトリのものではないので個人的には不安です。
WordPress をご利用の方は Better Search Replace で対処するとして、手元にある SQL に対して一括置換を行いたいときのために・・・
一括置換ツール開発しました!
GitHub:https://github.com/YuyaHoshino/SearchAndReplaceSerializedString
ダウンロード:https://github.com/YuyaHoshino/SearchAndReplaceSerializedString/archive/master.zip
使い方:Search And Replace Serialized String