Blobs in Firebird

Gespeichert von Lemmy am So., 16.09.2018 - 19:51

Wer Texte, Bilder oder sonstige Daten in einer Interbas/Firebird (IB/FB) Datenbank speichern will, verwendet daszu den Typ Blob. Doch was sind Blobs, wie funktionieren sie und wo kommen sie überhaupt her? Geschichte der Blobs Der Name "Blob" bedeutet im Grunde genommen gar nichts. Oft wird das Wort Blob als Abkürzung für „Binary Large Object“ oder "Basic Large Object" angesehen. Richtig ist aber, dass die Bezeichnung aus dem amerikanischen Science Fiction Spielfilm "The Blob" stammt. Der Hauptdarsteller (The Blob) war ein außerirdisches Monster das große Teile der USA verschlag. So in der Art stellten sich wohl auch die Väter des Blob Types die Funktion vor: Alles Mögliche in sich reinstopfen... Der Sub_type Jeder der schon mal mit Blobs gearbeitetet hat, weiß, dass er bei der Definition eines Blobfeldes einen Sub_Type angeben muss. Es existieren eine handvoll definierter Sub_types:

Sub_Type ID
Standard 0
Text 1
BLR 2
ACL 3
RANGES 4
SUMMARY 5
FORMAT 6
TRANSACTION_DISCRIPTION 7
EXTERNAL_FILE_DISCRIPTION 8

Von diesen Typen sind allerdings nur 3 für den Benutzer interessant:

  • Sub_Type 0: Das ist der Sub_Type in dem alles gespeichert werden kann (Bilder, Dateien,..)
  • Sub_Type 1: Dieser Sub_Type ist für Texte vorbehalten
  • Sub_Type 2: BLR (Binary Language Representation) ist die interne Sprache von IB/FB. In diese Sprache werden die SQL-Statements umgewandelt, bevor sie ausgeführt werden. Da StoredProcedures in dieser Sprache direkt in der DB gespeichert sind, besitzen sie gegenüber den "normalen" SQL-Anweisungen einen Geschwindigkeitsvorteil
  • Neben den definierten Blobtypen gibt es auch die Möglichkeit eigene Blobtypen zu "definieren". Dazu verwendet man negative Blob-Sub_types. Allerdings werden diese Blobtypen wie Sub_type 0 Blobs gespeichert und behandelt, so dass daraus eigentlich kein Vorteil gezogen werden kann, außer vielleicht um eine bessere Dokumentation der Datenbank zu erreichen. Die Segmentlänge Bei der Definition eines Blobs kann man außerdem eine Segmentlänge angeben. Der Standardwert beträgt 80 Byte, der größtmögliche Wert 32767 Byte (also 32 kByte). Die Segmentlänge gibt an, wieviel IB/FB auf einmal von einem Blob verarbeiten kann. Eine Änderung des Standardwert bringt nicht wirklich Vorteile. Die interne Speicherung von Blobs Blobs werden nicht direkt in der Tabelle gespeichert zu der sie gehören. In der Tabelle wird eine 8 Byte große Blob-ID gespeichert, der eigentliche Blob auf speziellen Datenbankseiten, wobei es 3 unterschiedliche Arten der Speicherung gibt:
    • Level 0: Der Blob passt genau in eine Speicherseite. Die Größe der Speicherseite wird durch den Parameter „Page Size“ beim Erzeugen der Datenbank angegeben.
    • Level 1: Auf der durch die BlobID angegebene Seite wird nicht der Blob gespeichert, sondern Adressen weiterer Seiten, auf denen dann der Blob liegt.
    • Level 2: Ist der Blob noch größer werden weitere Seiten mit Adressen zwischen der ersten Blobseite und den eigentlichen Seiten auf denen der Blob gespeichert wird, geschoben.
    • Nachdem wir die Blobs in der Datenbank bertrachtet haben, müssen die auch irgendwie in die DB reinkommen. Dazu gibt es zwei Möglichkeite: zum einen über die ein Casetool wie IBConsole oder über ein Clientprogramm. Mit der IBConsole oder vergleichbaren Programmen, ist es ziemlich umständlich Blobs zu bearbeiten. Aus diesem Grund lassen wir das auch gleich und gehen zur Clientanwendung in Delphi. Text-Blobs Text-Blobs sind einfach zu handhaben: Einfach eine TDBMemo-Komponente auf die Form setzen, mit der DataSource und dem Blobfeld verbinden und fertig. Weiter ist nichts zu tun. In den Text-Blobs können außerdem auch RTF-Text ohne Probleme gespeichert werden. Bilder Bei Bildern gilt grundsätzlich das selbe wie bei Texten, einfach eine DB-Image Komponente auf das Formular, diesmal aber mit einem Blobfeld mit dem Sub-Typ 0 verbinden – fertig. Sonstige Dateien Um sontige beliebige Dateien in Blobs zu speichern verwendet Ihr die Datenbankfelder. Macht einen Rechten Mausklick auf die IBDataSet und wählt im Popupmenü den Eintrag Feldeditor. Im Feldeditor macht ihr wieder einen Rechtsklick und wählt "Alle Felder hinzufügen" aus. Nun erscheinen alle Datenbankfelder im Editor. Diese könnt ihr wie folgt ansprechen: "Name der IBDataSet""Name des Feldnamens" in unserem Beispielprojekt also IBDataSet1BINARYBLOB Dieses Objekt hat nun ein paar Methoden, die das Leben etwas einfacher machen, u.a. LoadFromFile und SaveToFile. Mit diesen beiden Methoden lassen sich beliebige Dateien in einem Blob schreiben und auch wieder auslesen. Beim Auslesen und Abspeichern auf der Festplatte müsst ihr allerdings darauf achten, dass ihr die Datei mit der richtigen Extension abspeichert! Also nicht eine Word-Doc als Excel-Datei abspeichern. Bei Fragen oder Hinweise/Fehler bitte eine Email an lemmy @delphi-tutorials.de Quellen: "InterBase and Blobs – A Technical Overview" (Paul Beach, November 2000, IBPheonix Inc.) "InterBase 4.x/5" von Paul Beach, Jöpi Janning, Holger Klemt erchienen im bhv Verlag, ISBN 3-89360-344-1 Wolfgang Lemmermeyer - März 2006