Frage

Wie speichere ich Binärdaten in MySQL?

War es hilfreich?

Lösung

Die Antwort von phpguy ist richtig, aber ich denke, dass die zusätzlichen Details dort sehr verwirrend sind.

Die grundlegende Antwort ist in a BLOB Datentyp/Attributdomäne. KLECKS ist die Abkürzung für Binary Large Object und dieser Spaltendatentyp ist speziell für die Verarbeitung von Binärdaten bestimmt.

Sehen die entsprechende Handbuchseite für MySQL.

Andere Tipps

Für eine Tabelle wie diese:

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)
);

Hier ist ein PHP-Beispiel:

<?php
    // store.php3 - by Florian Dittmer <dittmer@gmx.net>
    // 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>

Ich empfehle dringend gegen Speichern von Binärdaten in einer relationalen Datenbank.Relationale Datenbanken sind für die Arbeit mit Daten fester Größe konzipiert.Darin liegt ihre Leistungsstärke:erinnern Joels alter Artikel Warum sind Datenbanken so schnell?weil es genau 1 Zeigerinkrement benötigt, um von einem Datensatz zu einem anderen Datensatz zu wechseln.Wenn Sie BLOB-Daten undefinierter und stark variierender Größe hinzufügen, verschlechtert sich die Leistung.

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

Sie haben zwar nicht gesagt, was Sie speichern, und Sie haben vielleicht einen guten Grund dafür, aber oft lautet die Antwort „als Dateisystemreferenz“ und die eigentlichen Daten befinden sich irgendwo im Dateisystem.

http://www.onlamp.com/pub/a/onlamp/2002/07/11/MySQLtips.html

Dies hängt von den Daten ab, die Sie speichern möchten.Das obige Beispiel verwendet die LONGBLOB Datentyp, aber Sie sollten sich darüber im Klaren sein, dass es noch andere binäre Datenformate gibt:

TINYBLOB/BLOB/MEDIUMBLOB/LONGBLOB
VARBINARY
BINARY

Jeder hat seine Anwendungsfälle.Wenn es sich um eine bekannte (kurze) Länge handelt (z. B.gepackte Daten) oft BINARY oder VARBINARY wird funktionieren.Sie haben den zusätzlichen Vorteil, dass sie indiziert werden können.

Obwohl es nicht notwendig sein sollte, können Sie es versuchen base64 Daten ein- und auskodieren.Das bedeutet, dass die Datenbank nur ASCII-Zeichen enthält.Es wird etwas mehr Platz und Zeit in Anspruch nehmen, aber alle Probleme im Zusammenhang mit den Binärdaten werden beseitigt.

Wenn die - nicht empfohlen - BLOB-Feld vorhanden, Sie können Daten auf diese Weise speichern:

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

Idee entnommen aus Hier.

Es stellt sich auch die Frage, wie man die Daten in das BLOB bekommt.Sie können die Daten in eine INSERT-Anweisung einfügen, wie das PHP-Beispiel zeigt (obwohl Sie Folgendes verwenden sollten). mysql_real_escape_string anstelle von Addslashes).Wenn die Datei auf dem Datenbankserver vorhanden ist, können Sie auch MySQL verwenden LADE DATEI

Wenn ich Binärdaten speichern muss, verwende ich immer VARBINARY Format, wie eingeführt byd0nut.

Die Dokumentation finden Sie auf der MySQL-Website unter „Dokumentiertes Thema“. 12.4.2 Die Typen BINARY und VARBINARY

Wenn Sie nach den Vorteilen fragen, schauen Sie sich bitte die Frage an warum-varbinary-statt-varchar

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top