it-swarm.com.de

Bild direkt in der Datenbank oder als Base64-Daten speichern?

Das übliche Verfahren zum Speichern von Bildern in einer Datenbank ist das Konvertieren des Bildes in base64-Daten, bevor die Daten gespeichert werden. Dieser Vorgang erhöht die Größe um 33%. Alternativ ist es möglich, das Bild direkt als BLOB zu speichern. zum Beispiel:

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

und zeigen Sie dann das Bild mit an

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

Mit der letzteren Methode sparen wir 1/3 Speicherplatz. Warum ist es üblicher, Bilder als base64 in MySQL-Datenbanken zu speichern?

UPDATE: Es gibt viele Debatten über Vor- und Nachteile des Speicherns von Bildern in Datenbanken, und die meisten Leute glauben, es sei kein praktischer Ansatz. Wie dem auch sei, ich nehme an, wir speichern Bilder in einer Datenbank und besprechen die beste Methode dafür.

44
Googlebot
  • Pro base64: Die codierte Darstellung, die Sie behandeln, ist eine ziemlich sichere Zeichenfolge. Es enthält weder Steuerzeichen noch Anführungszeichen. Der letzte Punkt hilft gegen SQL-Injection-Versuche. Ich würde nicht erwarten, dass der Wert einfach zu einer "handcodierten" SQL-Abfragezeichenfolge hinzugefügt wird.

  • Pro BLOB: Die Datenbankmanager-Software weiß, welche Art von Daten sie erwarten muss. Es kann dafür optimieren. Wenn Sie base64 in einem TEXT-Feld speichern, wird möglicherweise versucht, einen Index oder eine andere Datenstruktur für dieses Feld zu erstellen. Dies wäre wirklich schön und nützlich für "echte" Textdaten, aber sinnlos und eine Verschwendung von Zeit und Platz für Bilddaten. Und es ist die kleinere Darstellung, wie in der Anzahl Bytes.

53
user1252434

Ich behaupte, dass Bilder (Dateien) normalerweise NICHT in einer base64-kodierten Datenbank gespeichert werden. Stattdessen werden sie in ihrer rohen binären Form in einer binären (Blob) Spalte (oder Datei) gespeichert.

Base64 wird nur als Transportmechanismus verwendet, nicht zum Speichern. Sie können beispielsweise ein base64-codiertes Bild in ein XML-Dokument oder eine E-Mail-Nachricht einbetten.

Base64 ist auch Stream-freundlich. Sie können im laufenden Betrieb kodieren und dekodieren (ohne die Gesamtgröße der Daten zu kennen).

Während base64 für den Transport geeignet ist, speichern Sie Ihre Bilder nicht base64-codiert .

Base64 liefert keine Prüfsumme oder irgendetwas für die Speicherung.

Die Base64-Codierung erhöht den Speicherbedarf um 33% gegenüber einem unformatierten Binärformat. Es erhöht auch die Datenmenge, die aus dem permanenten Speicher gelesen werden muss, was im Allgemeinen immer noch der größte Engpass in der Datenverarbeitung ist. Es ist im Allgemeinen schneller, weniger Bytes zu lesen und sie im laufenden Betrieb zu codieren. Nur wenn Ihr System an eine CPU gebunden ist und nicht an IO gebunden ist und Sie das Abbild regelmäßig in base64 ausgeben, sollten Sie das Speichern in base64 in Betracht ziehen.

Inline-Bilder (in HTML eingebettete Base64-codierte Bilder) sind selbst ein Engpass. Sie senden 33% mehr Daten über das Kabel und machen dies seriell (der Webbrowser muss auf die Inline-Bilder warten, bevor der Download der Seite abgeschlossen ist HTML).

Wenn Sie dennoch Base64-kodierte Bilder speichern möchten, stellen Sie sicher, dass Sie keine Base64-kodierten Daten in einer UTF8-Spalte speichern und indizieren.

50
Marcus Adams

Ich empfehle, sich moderne Datenbanken wie NoSQL anzusehen, und stimme auch dem Beitrag von user1252434 zu. Ich speichere zum Beispiel ein paar <500 kb PNGs als base64 auf meiner Mongo-Datenbank ab, wobei binär auf true gesetzt ist und keinerlei Performance-Treffer erzielt werden. Mongo kann verwendet werden, um große Dateien wie 10-MB-Videos zu speichern. Dies kann große Zeitersparnisse bei der Metadatensuche für diese Videos bieten. Siehe Speichern großer Objekte und Dateien in Mongodb

0
msmfsd