2008-08-01 13 views
159

Wie speichere ich binäre Daten in MySQL?Binärdaten in MySQL

+0

[Speichern-Bilder-in-db-ja-oder-nein] (https://StackOverflow.com/questions/3748/) –

+1

@Nevir: Welche Informationen sind Sie speziell nach? Was fehlt Ihrer Meinung nach [@ phpguys] (https://stackoverflow.com/questions/17/binary-data-in-mysql#18) und [@ Mat's] (https://stackoverflow.com/questions/ 17/binary-data-in-mysql # 26) Antworten? – eggyal

+0

Sorry, ich wollte das nicht bounty (lief in einen UI-Bug mit SO), aber kann das Bounty nicht entfernen – Nevir

Antwort

122

Die Antwort von phpguy ist richtig, aber ich denke, es gibt eine Menge Verwirrung in den zusätzlichen Details gibt es .

Die grundlegende Antwort ist in einer BLOB Datentyp/Attributdomäne. BLOB ist die Abkürzung für Binary Large Object. Dieser Spaltendatentyp ist speziell für die Verarbeitung binärer Daten ausgelegt.

Siehe the relevant manual page for MySQL.

50

Für eine Tabelle wie folgt aus:

CREATE TABLE binary_data (
    id INT(4) NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    description CHAR(50), 
    bin_data LONGBLOB, 
    filename CHAR(50), 
    filesize CHAR(50), 
    filetype CHAR(50) 
); 

ist hier ein PHP Beispiel:

<?php 
    // store.php3 - by Florian Dittmer <[email protected]> 
    // Example php script to demonstrate the storing of binary files into 
    // an sql database. More information can be found at http://www.phpbuilder.com/ 
?> 

<html> 
    <head><title>Store binary data into SQL Database</title></head> 

    <body> 
     <?php 
      // Code that will be executed if the form has been submitted: 

      if ($submit) { 
       // Connect to the database (you may have to adjust 
       // the hostname, username or password). 

       mysql_connect("localhost", "root", "password"); 
       mysql_select_db("binary_data"); 

       $data = mysql_real_escape_string(fread(fopen($form_data, "r"), filesize($form_data))); 

       $result = mysql_query("INSERT INTO binary_data (description, bin_data, filename, filesize, filetype) ". 
            "VALUES ('$form_description', '$data', '$form_data_name', '$form_data_size', '$form_data_type')"); 

       $id= mysql_insert_id(); 
       print "<p>This file has the following Database ID: <b>$id</b>"; 

       mysql_close(); 
      } else { 

       // else show the form to submit new data: 
     ?> 
     <form method="post" action="<?php echo $PHP_SELF; ?>" enctype="multipart/form-data"> 
      File Description:<br> 
      <input type="text" name="form_description" size="40"> 
      <input type="hidden" name="MAX_FILE_SIZE" value="1000000"> 
      <br>File to upload/store in database:<br> 
      <input type="file" name="form_data" size="40"> 
      <p><input type="submit" name="submit" value="submit"> 
     </form> 

     <?php 
      } 
     ?> 
    </body> 
</html> 
+8

Dieser Code sieht aus wie PHP3 (oder vielleicht 4), die register_globals aktiviert. Sie möchten diesen Code nicht ausführen, und er funktioniert auch nicht bei einer halbaktuellen PHP-Installation (Version 5). – Till

+21

-1 für addslashes() wobei mysql_real_escape_string() benötigt wird. Können wir bitte aufhören, Leuten Code mit SQL-Injection-Sicherheitslücken zu geben? (Nein, addslashes() ist NICHT gut genug.) – chaos

8

Die Frage stellt sich auch, wie die Daten in den BLOB zu bekommen. Sie können die Daten in eine INSERT-Anweisung einfügen, wie das PHP-Beispiel zeigt (obwohl Sie anstelle von addslashes mysql_real_escape_string verwenden sollten). Wenn die Datei auf dem Datenbankserver vorhanden ist, können Sie auch die LOAD_FILE

12

von MySQL verwenden. Es könnte jedoch nicht erforderlich sein, base64 zu codieren und zu dekodieren. Das bedeutet, dass die DB nur ASCII-Zeichen haben wird. Es wird etwas mehr Platz und Zeit benötigen, aber jedes Problem mit den Binärdaten wird beseitigt.

7

Eine viel bessere Speicherimplementierung verfügbar here. Sie werden auf Probleme mit der Implementierung von Florian stoßen.

35

Ich binäre Daten in einer relationalen Datenbank wird dringend empfohlen gegen zu speichern. Relationale Datenbanken sind so konzipiert, dass sie mit Daten fester Größe arbeiten. Das ist, wo ihre Leistungsstärke ist: Denken Sie daran, Joel's old article warum Datenbanken so schnell sind? weil es genau 1 Zeigerinkrement benötigt, um von einem Datensatz zu einem anderen Datensatz zu gelangen. Wenn Sie BLOB-Daten mit undefinierter Größe hinzufügen, wird die Leistung beeinträchtigt.

Speichern Sie stattdessen Dateien im Dateisystem und speichern Sie Dateinamen in Ihrer Datenbank.

+10

Ich habe nicht downvote, aber es könnte sein, dass er impliziert, dass Sie es NIE tun sollten, im Gegensatz zu sagen, dass es die meiste Zeit eine schlechte Idee ist. Ich stimme ihm generell zu, aber nicht in 100% der Fälle. Es kann andere Überlegungen als die Leistung geben. Zum Beispiel arbeite ich gerade an etwas, bei dem Leistung überhaupt keine Rolle spielt. Andere Faktoren wie Zentralisierung, Einfachheit und Backups bedeuten, dass in diesem Fall das Speichern in der Datenbank sinnvoll ist. Ein weiterer häufiger Grund ist die Replikation. – YeB

+1

BLOB-Feld hat eine feste Größe von 64 Kilobyte. Es variiert nicht, oder? –

+0

64KB passen nicht viele Dateien hinein - Sie müssen also mehr als einen 64KB-Block zum Speichern der Daten haben. –

15

Es hängt von den Daten ab, die Sie speichern möchten. Das obige Beispiel verwendet die LONGBLOB Datentyp, aber Sie sollten sich bewusst sein, dass es andere binäre Datenformate:

TINYBLOB/BLOB/MEDIUMBLOB/LONGBLOB
VARBINARY
BINARY

Jede ihre Anwendungsfälle hat. Wenn es eine bekannte (kurze) Länge ist (z. B. gepackte Daten), wird oft BINARY oder VARBINARY funktionieren. Sie haben den zusätzlichen Vorteil, in der Lage zu sein, Index auf ihnen.

9

Wenn das - not recommended - BLOB-Feld vorhanden ist, können Sie die Daten auf diese Weise sparen:

mysql_query("UPDATE table SET field=X'".bin2hex($bin_data)."' WHERE id=$id"); 

Idee von here genommen.