通常、データベースには int 型と varchar 型のデータのみが保存されます。第一に、最新のリレーショナル データベースではこれらの内容に対して多くの最適化が行われているためです。第二に、ほとんどのインデックスコンテンツが多すぎるフィールドには適用できません。たとえば、テキスト タイプのフィールドはインデックスの作成には適していません。したがって、データベースを使用する場合、大きなコンテンツ フィールドをデータベースに保存することはほとんどありません。ただし、MySQL は実際にはこのタイプのストレージを用意していますが、通常はあまり使用しません。
「大規模」とは通常「約 4kb 以上」を意味しますが、一部のデータベースでは最大 32kb のデータを簡単に処理できます。大きなオブジェクトは本質的にテキストまたはバイナリである可能性があり、PDOStatement::bindParam() または PDOStatement::bindColumn() 呼び出しで PDO::PARAM_LOB 型コードを使用することで、PDO に大きなデータ型を使用させることができます。 PDO::PARAM_LOB は、PHP Streams API を使用してデータを操作できるように、データをストリームとしてマップするように PDO に指示します。
MySQL では、フィールド タイプを blob に設定することは、フィールドがラージ オブジェクト形式であることを意味します。 bindParam() または bindingColumn() を使用する場合、指定されたフィールドのパラメーターが PDO::PARAM_LOB 型の場合、このオブジェクトの内容をハンドルの形式で直接取得し、fopen( と同様に操作を続けることができます) )。
rreeこれはテスト用のデータ テーブルです。添付フィールドは、より多くの情報を格納できるように、比較的大きな BLOB タイプである longblob タイプに設定されています。結局のところ、今日の写真やファイルは簡単に数 MB または数十 MB から始まる可能性があるため、簡単なテストには最大の BLOB タイプを直接使用します。 tinyblob のサイズは 255 バイト、blob タイプのサイズは 65k、mediumblob は 16M、longblob は 4G です。
ビッグ データ オブジェクトを直接操作して、結果がどうなるかを見てみましょう。
rreefopen() によって開かれたファイルを、最初にフィールドをバインドせずに、BLOB フィールドに直接保存します。データベースから、BLOB 関連フィールドには「リソース ID #6」の形式で文字列のみが格納されていることがわかります。つまり、何も処理せずに、$fp ハンドルは文字列型に強制され、ハンドル型が強制された結果、リソース ID のみが出力され、BLOB は文字型と同じになるだけになります。この文字列は記録されたばかりです。
次に、正しい姿勢を見てみましょう。これは、bindParam() を介してデータを挿入し、bindColumn() を介してデータを読み取ることです。
<code>CREATE TABLE `zy_blob` (<br> `id` int(11) NOT NULL AUTO_INCREMENT,<br> `attach` longblob,<br> PRIMARY KEY (`id`)<br>) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;<br></code>
まず、bindParam() でデータをバインドし、PDO::PARAM_LOB タイプを指定した後、ファイル ハンドルのバイナリ コンテンツを通常どおりデータベースに挿入します。次に、bindColumn() を使用し、PDO::PARAM_LOB タイプも指定して、クエリされたデータを取得します。クエリされたフィールド情報を直接出力すると、それがバイナリ型のコンテンツであることがわかります。最後に、このバイナリ コンテンツを別の名前でファイルに保存します。
以上がPDO が MySQL でビッグ データ オブジェクトを操作する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。