2012-05-27 11 views
10

私はmysqlを使ってデータベースに格納されるたくさんの配列をPHPで直列化しています。シリアル化(データ)のためのどのmysql列型ですか?

最終的な文字列の長さは、2000〜100000 +の間のどの文字とも大きく異なる場合があります。

私は現在、LONGTEXTと設定していますが、これは残酷だと感じています!データベースはすでにアクティブで、約3百万行があります。これはすぐに追加される新しい列です。それはカットオフとバイナリ安全にシリアライズを壊されないように

+4

100,000文字は非常に高いオプションを制限します。また、MySQLでこれらの配列を操作したり、それらを検索したい場合、または基本的にはデータを大量のデータとして扱う以外は、シリアル化する代わりに適切に格納する必要があります。 – Corbin

+0

これはphpで表示されるデータのストレージセンターであり、mysqlによる操作は決して起こりません。ありがとう@corbin – hadley

+0

は、longbinaryフィールド型の方が優れています。すべてのテキストフィールドは文字セット変換の対象となり、シリアル化されたデータが破損する可能性があります。 –

答えて

15

、必ずデータをシリアル化するために任意のBLOB data-typeを使用

感謝。最後の文字列の長さに最大値がない場合は、LONGBLOBが必要です。データが2^24文字で埋められないことがわかっている場合は、MEDIUMBLOBを使用できます。 MEDIUMBLOBは約16MBですが、LONGBLOBは約4GBですので、私はあなたのかなり安全だと言うでしょうMEDIUMBLOB

なぜバイナリデータ型ですか? Mysqlのテキストデータ型にはエンコーディングがあります。文字エンコーディングは、異なるエンコーディング間で直列化データがどのように転置されるかに影響します。例えば。 Latin-1として保存された後にUTF-8として読み取られた場合(たとえば、データベースドライバ接続のエンコーディング設定のため)、バイナリオフセットがシフトしたためにシリアライズされたデータが壊れることがあります。 PHPのシリアライズされた文字列はバイナリデータであり、特定のエンコーディングではありません。

7

(マークBが述べたように)あなたが)(シリアライズするためのPHPマニュアルごとにBLOBを選択してください:

「この[出力]ヌルバイトを含むことができるバイナリストリングなお、及び格納する必要がありますたとえば、serialize()の出力は、通常、CHARまたはTEXTフィールドではなく、データベースのBLOBフィールドに格納する必要があります。

出典:サイズに関してはもちろんhttp://php.net/serialize

J.Moneyの入力は、同様に留意しなければならない - でも、BLOBには限界があり、あなたがそれらを超えしようとしているならば、あなたはMEDIUMBLOBやLONGBLOBが必要になります。

関連する問題