Announcement

Collapse
No announcement yet.

Bilder speichern in der Datenbank

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Bilder speichern in der Datenbank

    Hallo zusammen,

    könnte mir jemand sagen, wie ich die Bilder in der Datenbank speichern kann, und welche Spaltentyp dazu passt?

    Gruß

    Leonid

  • #2
    Mit dem RDBMS (Relational Database Management-System) MySQL ist es prinzipiell möglich, binäre Daten zu speichern - dabei ist es vollkommen egal, ob es sich nun um Grafiken (JPEG, GIF, PNG etc.), Soundfiles (mp3 etc.) oder PDF-Dateien handelt.

    Troztdem fühlt sich mancher Anwender verunsichert und es taucht vor allem immer wieder eine Frage auf: Welcher Datentyp wird eigentlich für binäre Daten verwendet? Die Antwort: Verwenden Sie den Datentyp BLOB (Binary large object). Dazu später mehr.

    Grundsätzlich gibt es zwei probate Vorgehensweisen, um binäre Daten in einer Datenbank abzulegen. Die erste Methode bedient sich eines normalen SQL-Statements (unter Verwendung der LOAD_FILE() Funktion); die zweite Methode sieht vor, ein Programm zu schreiben, welches erst die Bild-Datei einliest und anschliessend ein sauberes INSERT-Statement generiert. Hier wird aber nur die erste Methode detailliert behandelt.

    Zum praktischen Teil. Eine einfache Tabelle für eine Bilddatenbank könnte zum Beispiel so aussehen:
    <PRE>
    CREATE TABLE meineBilder
    (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    name VARCHAR(30) NOT NULL,
    type VARCHAR(30) NOT NULL,
    img_data MEDIUMBLOB NOT NULL,
    PRIMARY KEY (id),
    UNIQUE (name)
    );
    </PRE>
    Damit sollte auch die Frage beantwortet sein, welcher Datentyp verwendet werden muss (nämlich MEDIUMBLOB). Der neugierige Leser findet weitere Informationen zu BLOB im MySQL-Manual.

    Das folgende SQL-Statement demonstriert die vereinfachte Anwendung der Funktion LOAD_FILE(); übergeben Sie einfach den Pfad an die Funktion - das ist alles.
    <PRE>
    INSERT INTO meineBilder (img_data) VALUES(LOAD_FILE('/pfad/zu/meinbild.jpg'));
    </PRE>
    Aber Vorsicht: Generell müssen drei Vorraussetzungen erfüllt sein, um mit LOAD_FILE() erfolgreich arbeiten zu können. Die Bild-Datei muss sich auf dem gleichen Host befinden, auf dem der MySQL-Server läuft; weiterhin muss die Datei für den MySQL-Server lesbar sein (Stichwort: Rechte) und last not least muss der Anwender im Besitz des FILE-Privilegs sein.

    Deshalb kommt diese Lösung nicht für jeden Nutzer in Betracht; und manchmal muss man in den sauren Apfel beißen und ein Programm aufsetzen.

    Am Schluss muss auf eine sehr wichtige Fragestellung in diesem Kontext eingegangen werden: Sollte man überhaupt Bilder (oder binäre Daten) in einer Datenbank ablegen, oder sollte man sie vielmehr im lokalen Dateisystem (meist dem des Webservers) speichern? Nun, das ist eine typische Pro-und-Contra Angelegenheit.

    Die Vorteile der Speicherung von Bildern in einer Datenbank:<br>

    - in einer verteilten Umgebung (im WWW) kann diese Lösung Vorteile bieten (Datenabgleich etc.)

    - leichtere Wartung der Daten (aktualisieren, löschen, hinzufügen)

    Die Vorteile der Speicherung von Bildern im Dateisystem:<br>

    - die MySQL-Tabellen werden "aufgeblasen" (Stichwort: Systemressourcen sparen)

    - ist günstiger für Web-Applikationen (da weniger Lese-u. Schreibvorgänge)

    - besser für Webentwickler (durch Verwendung des <img> Tags - nur Pfadangabe notwendig)

    - Zugriff auf BLOB ist langsamer (wegen der variablen Länge des Typs)

    Und zum guten Schluss die knappe Antwort auf die nicht gestellte Frage des Auslesens von binären Daten aus einer Datenbank.
    <PRE>
    SELECT * FROM meineBilder WHERE id = 1;
    </PRE>
    Das ist alles - was Sie allerdings mit diesen Daten danach anstellen (die Weiterverarbeitung), nun das ist wiederum ein Thema für sich;-).

    Thomas Kaufman

    Comment


    • #3
      Hallo Leonid

      Was für einen Grund sollte es denn geben, Bilder in einer Datenbank zu speichern? Die Datenbank, die Binärdaten [also auch Bilder] normalerweise beinhaltet, ist i.d.R. eh schon die schnellste - nämlich das Filesystem.

      Klar, es geht [s.o.] - aber den Sinn des ganzen sehe ich nicht ohne weiteres.

      Gruß
      Ric

      Comment


      • #4
        Solltest du aber einen variablen Pfad brauchen, geht es für den Import so:
        <PRE>
        Set RsUser = New ADODB.Recordset
        RsUser.CursorLocation = adUseClient
        sql = ""
        sql = "SELECT high_priority * FROM Tbldaten WHERE ID = 0;"
        RsUser.Open sql, GlConnect, adOpenDynamic, adLockOptimistic, adCmdText
        RsUser.AddNew

        Nr = FreeFile

        Open Pfad & MyArray(I) For Binary As #Nr

        ReDim BinaryData(LOF(Nr))
        Get #Nr, , BinaryData()
        RsUser(strString).AppendChunk BinaryData
        Erase BinaryData

        Close #Nr

        RsUser.Update
        </PRE>

        Export funktioniert so:

        <PRE>
        Set RsUser = New ADODB.Recordset
        RsUser.CursorLocation = adUseClient
        sql = ""
        sql = "SELECT high_priority Daten, Filename FROM Tbldaten WHERE ID = 1;"
        RsUser.Open sql, GlConnect, adOpenDynamic, adLockOptimistic, adCmdText

        Nr = FreeFile
        Erase BinaryData

        Open Pfad & FileName For Binary As #Nr

        RsUser.MoveFirst
        ReDim BinaryData(RsUser("Daten").ActualSize)
        BinaryData = RsUser("Daten").Value
        Put #Nr, , BinaryData

        Close #Nr
        </PRE&gt

        Comment

        Working...
        X