Announcement

Collapse
No announcement yet.

mySQL: Binäre Daten im Blob-Feld?

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

  • mySQL: Binäre Daten im Blob-Feld?

    Hallo zusammen.

    Vielleicht bin ich ja blöd aber wie speichert man binäre Daten (z.B. EXE-Files etc.) in einem Blob-Feld?

    Peter

  • #2
    Prinzipiell mit "INSERT INTO ... (column1) VALUES ('value1')". Damit das funktioniert, musst Du die binaeren Daten vorher escapen und Dich dabei strikt an die Regeln von MySQL halten:<p>
    NUL - ASCII 0. You should represent this by '\0' (a backslash and an ASCII '0' character).<br>
    \ ASCII 92, backslash. Represent this by '\\'.<br>
    ' ASCII 39, single quote. Represent this by '\''.<br>
    " ASCII 34, double quote. Represent this by '\"'.<p>
    Am besten erledigst Du das mit der 8-Bit-safe str_replace-Routine:
    <pre>
    function blob_escape($bindata) {
    $bindata = str_replace('\\', '\\\\', $bindata);
    $bindata = str_replace('\0', '\\\0', $bindata);
    $bindata = str_replace('\'', '\\\'', $bindata);
    $bindata = str_replace('\"', '\\\"', $bindata);
    return $bindata;
    }
    </pre>
    Wichtig natuerlich die Reihenfolge: Erst \ ersetzen, weil die anderen drei Ersetzungen ja jeweils \ einfuegen - klar. Wenn man will, kann man das auch in eine einzige str_replace-Anweisung packen, die kann ja mit Arrays umgehen. Aber so ist es besser lesbar, find ich. Das ganze ist uebrigens unter http://www.mysql.com/doc/S/t/String_syntax.html (ein bissel scrollen) nachzulesen.<p>
    Gruss, Marc

    Comment


    • #3
      Ach du meine Güte, was für ein Aufwand. Aber vielen Dank, ich werde es ausprobieren.

      Pete

      Comment


      • #4
        Was sagt man gemeinhin wenn jemand (potentiell grosse) Binärdaten in MySQL speichern möchte: verwende doch die speziell für Binärdaten gebaute Datenbank, die bei dem Betriebssystem deiner Wahl mitgeliefert wird und auf äusserst niedriger Ebene unterstützt wird

        Comment


        • #5
          Binaerdaten liegen in einer Datenbank schon sehr gut, egal wie gross. Waehrend "normale" Daten wie Integer oder Strings mit teilweise grossem Verschnitt in eine Datenbank uebernommen werden (fuer Indizes, bei CHAR()-Datentypen fuer die Leerbytes), gilt die Faustregel Platzbedarf der Datenbank = Groesse der Rohdaten * 4 nicht fuer LOBs.<p>
          Die Alternative, dass in der DB nur Pfade + Filenamen gespeichert werden, ist zu Anfang vielleicht verlockend, aber nach ein wenig Einarbeitung ist es keine Kunst mehr, mit LOBs (sowohl Text als auch binary) umzugehen. Neben den direkten Vorzuegen der Abfrage (SELECT mimetype, data FROM imageArchive WHERE LENGTH(data) > 65535 LIMIT 1) von Binaerdaten in einer beliebig komplexen SQL-Anweisung braucht man sich dann auch keine Gedanken mehr ueber die Verzeichnis-Strukturen oder nicht-konforme Dateinamen mehr zu machen, ausserdem kann man von einer Datenbank prima ein Backup ziehen bzw. einen Mirror anlegen.<p>
          Natuerlich KANN man fuer Binaerdaten ein zweites Datenbanksystem oder eine selbstgebaute Kruecke verwenden, das bleibt ganz im persoenlichen Interesse.<p>
          Gruss, Marc

          Comment


          • #6
            mysql_query("INSERT INTO `zieltabelle` VALUES ('',LOAD_FILE('$tmp_file'));",$con);

            liest $tmp_file direkt binär in die zieltabelle ein, alte mysql-datenbanken kennen diesen Befehl aber noch nicht

            Comment


            • #7
              Also ich habe mit mySQL und dem Speichern von Binärdaten nicht sehr gute Erfahrungen gemacht. Wir haben mal die Bilder einer sehr gut besuchten Webseite in der DB gespeichert, mit dem Resultat, dass mySQL sowas von langsam war, dass oft überhaupt nichts mehr ging. Wir reduzierten es wieder auf das speichern der Pfade in der DB und der Files im Filesystem.
              Ich kann nur davon abraten, da mySQL dafür nicht sehr geeignet ist. Schon eher Postgres, DB2 oder Oracle

              greez
              Marku

              Comment


              • #8
                @markus meier:
                das verhalten von mysql bei BLOB felder hängt extrem stark 1. von der gesamtgröße der datenbank (was anzahl der datensätze angeht), 2. der art der benutzten tabellen (MyISAM, InnoDB) und 3. von dem aufbau der tabelle ab.
                normalerweise kann mysql recht gut mit BLOB-feldern arbeiten und wird auch icht unbedingt merklich langsamer, wenn man nicht z.b. den fehler macht auf diese BLOB-felder einen index zu legen ;o)..

                Comment

                Working...
                X