web-dev-qa-db-ja.com

画像をデータベースに直接保存するか、base64データとして保存しますか?

データベースに画像を保存する一般的な方法は、データを保存する前に画像をbase64データに変換することです。このプロセスにより、サイズが33%増加します。または、画像をBLOB;として直接保存することもできます。例えば:

$image = new Imagick("image.jpg");
$data = $image->getImageBlob();
$data = $mysqli->real_escape_string($data);
$mysqli->query("INSERT INTO images (data) VALUES ('$data')");

そして、画像を表示します

<img src="data:image/jpeg;base64,' .  base64_encode($data)  . '" />

後者の方法では、1/3のストレージスペースを節約できます。 MySQLデータベースにbase64として画像を保存する方が一般的なのはなぜですか?

PDATE:データベースに画像を保存することの利点と欠点について多くの議論があり、ほとんどの人はそれが実際的なアプローチではないと考えています。とにかく、ここではデータベースに画像を保存し、それを行うための最良の方法を議論すると仮定します。

50
Googlebot
  • Pro base64:処理するエンコードされた表現は非常に安全な文字列です。制御文字も引用符も含まれていません。後者の点は、SQLインジェクションの試みに役立ちます。 「手動でコーディングされた」SQLクエリ文字列に値を追加するだけで問題はないと思います。

  • Pro BLOB:データベースマネージャーソフトウェアは、どのタイプのデータを予期する必要があるかを認識しています。そのために最適化できます。 base64をTEXTフィールドに格納する場合、インデックスまたはその他のデータ構造を構築しようとする可能性があります。これは、「実際の」テキストデータには非常に便利ですが、画像データには無意味で時間とスペースの無駄です。そして、バイト数のように、より小さい表現です。

60
user1252434

私は、画像(ファイル)は通常、base64でエンコードされたデータベースに保存されないと主張します。代わりに、バイナリ(blob)列(またはファイル)に生のバイナリ形式で保存されます。

Base64はトランスポートメカニズムとしてのみ使用され、ストレージには使用されません。たとえば、base64でエンコードされた画像をXMLドキュメントまたは電子メールメッセージに埋め込むことができます。

Base64もストリームフレンドリーです。エンコードとデコードをその場で(データの合計サイズを知らなくても)行うことができます。

Base64は転送には適していますが、エンコードされた画像をbase64でエンコードしないでください

Base64は、チェックサムもストレージの値も提供しません。

Base64エンコードは、ストレージ要件を生のバイナリ形式より33%増やします。また、一般的にコンピューティングの最大のボトルネックである永続ストレージから読み取る必要があるデータの量も増加します。一般に、少ないバイトを読み取り、その場でエンコードする方が高速です。システムがIOの代わりにCPUにバインドされ、base64で定期的にイメージを出力している場合のみ、base64に保存することを検討してください。

インライン画像(HTMLに埋め込まれたbase64エンコード画像)はそれ自体がボトルネックです-ワイヤ経由で33%以上のデータを送信し、シリアルに送信しています(Webブラウザーはページのダウンロードを完了する前にインライン画像を待機する必要があります) HTML)。

それでもbase64でエンコードされた画像を保存する場合は、何をするにしても、base64でエンコードされたデータをUTF8列に保存しないようにしてからインデックスを作成してください。

59
Marcus Adams

NoSQLのような最新のデータベースを見ることをお勧めします。また、user1252434の投稿にも同意します。たとえば、Mongo dbにbase64として500 KB未満のいくつかのPNGを格納し、バイナリをtrueに設定すると、パフォーマンスがまったく低下しません。 Mongoは、10MBビデオなどの大きなファイルを保存するために使用でき、それらのビデオのメタデータ検索で時間を大幅に節約できる利点があります。 mongodb での大きなオブジェクトとファイルの保存を参照してください。

0
msmfsd