Firebird Documentation IndexFirebird 2.5 SprachreferenzDatentypen und Unterdatentypen → Binärdatentypen
Firebird Home Firebird Home Zurück: ZeichendatentypenFirebird Documentation IndexNach oben: Datentypen und UnterdatentypenWeiter: Spezialdatentypen

Binärdatentypen

Inhaltsverzeichnis

BLOB Untertypen
BLOB Specifics
ARRAY Type

BLOBs (Binary Large Objects) nutzen komplexe Strukturen, um Texte und binäre Daten beliebiger Länge zu speichern. Diese Daten sind häufig sehr groß.

Syntax: 

     BLOB [SUB_TYPE <subtype>]
         [SEGMENT SIZE <segment size>]
         [CHARACTER SET <character set>]
      

Gekürzte Syntax: 

     BLOB (<segment size>)
     BLOB (<segment size>, <subtype>)
     BLOB (, <subtype>)
      

Segmentgröße:  Das Spezifizieren von BLOB-Segmenten ist ein Rückschritt in vergangene Zeiten, als die Programme zur Verarbeitung von BLOB-Daten noch mit Hilfe des gpre-Pre-Compilers in C (Embedded SQL) geschrieben wurden. Heutzutage ist dies irrelevant. Die Segmentgröße für BLOB-Daten wird auf Client-Seite festgelegt und ist üblicherweise größer als die Größe der Datenseite.

BLOB Untertypen

Der optionale Parameter SUB_TYPE gibt die Art der zu schreibenden Felddaten an. Firebird unterstützt zwei vordefinierte Untertypen für die Datenspeicherung:

Untertyp 0: BINARYWurde kein Untertyp angegeben, wird von einem unspezifizierten Datentyp ausgegangen und somit als Standard SUB_TYPE 0 verwendet. Der Alias für diesen Untertyp ist BINARY. Dies ist der Untertyp, der bei der Arbeit mit jeglichen Binärdaten Verwendung findet: Bilder, Audio, Textdokumente, PDFs usw.

Untertyp 1: TEXTUntertyp 1 besitzt den Alias TEXT, welcher in Deklarationen und Definitionen verwendet werden kann. Zum Beispiel  BLOB SUB_TYPE TEXT.  Dies ist ein spezieller Untertyp zum Speichern von Textdaten, die zu lang für die üblichen Zeichenketten sind. Ein Zeichensatz (CHARACTER SET) kann definiert werden, sofern dieser vom Standard der Datenbank abweicht. Seit Firebird 2.0 ist die Angabe der COLLATE-Klausel ebenfalls gültig.

Benutzerdefinierte Untertypen: Weiterhin ist es möglich eigene Untertypen zu definieren, wofür der Zahlenbereich von -1 bis -32.768 reserviert ist. Selbstdefinierte Untertypen im positiven Zahlenbereich werden nicht unterstützt, da Firebird diese, von 2 aufwärts, für interne Untertypen in den Metadaten verwendet.

BLOB Specifics

Größe: Die Maximalgröße eines BLOB-Feldes ist auf 4GB begrenzt, unanhängig vom darunterliegenden 32- oder 64-Bit-Server. (Die internen Strukturen im Zusammenhang mit BLOBs nutzen ihre eigenen 4-Byte-Zähler.) Für Seitengrößen (page size) von 4 KB (4096 Bytes) ist die Maximalgröße geringer — etwas weniger als 2 GB.

Operationen und Ausdrücke: Text-BLOBs beliebiger Länge und jeder Zeichensatz—inklusive Multi-Byte— können Operanden für praktisch jede Art von Statement oder interne Funktionen sein. Die folgenden Operatoren werden vollständig unterstützt:

= (Zuweisung)
=, <>, <, <=, >, >= (Vergleich)
|| (Verkettung)
BETWEEN, IS [NOT] DISTINCT FROM,
IN, ANY|SOME,
ALL  

Teilunterstützt:

  • Ein Fehler wird ausgeworfen, wenn das Suchkritierium größer als 32 KB ist:

    STARTING [WITH], LIKE,
    CONTAINING  

  • Aggregations-Klauseln funktionieren nicht auf Basis der eigentlichen Feldwerte, jedoch mit den BLOB-IDs. Dementsprechend gibt es ein paar Macken:

    SELECT DISTINCT Gibt fälschlicherweise mehrere NULL-Werte zurück, sofern diese vorhanden sind.
    ORDER BY
    GROUP BY Verkettet die gleichen Zeichenketten, wenn sie aufeinanderfolgen, jedoch nicht, wenn sie voneinader entfernt liegen.

BLOB-Speicherung: 

  • Standardmäßig wird ein regulärer Datensatz für jeden BLOB erstellt und in der Datenseite (data page), die hierfür zugewiesen wurde, gespeichert. Passt das gesamte BLOB in diese Seite, spricht man auch von einem Level 0 BLOB. Die Seitenzahl dieses speziellen Datensatzes wird im Tabellendatensatz gespeichert und belegt 8 Bytes.

  • Passt das BLOB hingegen nicht in die Datenseite, wird der Inhalt auf separate Seiten verteilt, die exklusive hierfür belegt werden (BLOB-Seiten). Die Seitennummern werden in den BLOB-Datensatz geschrieben. Hierbei spricht man von einem Level 1 BLOB.

  • Falls das Array der Seitenzahlen, die die BLOB-Daten enthalten nicht in die Datenseite passen, wird diese Array auf separate BLOB-Seiten verteilt, während die Seitenzahlen dieser Seiten in den BLOB-Datensatz geschrieben werden. Hierbei spricht man von einem Level 2 BLOB.

  • Level größer als 2 werden nicht unterstützt.

Vergleichen Sie auch:  FILTER, DECLARE FILTER

ARRAY Type

Die Unterstützung von Arrays im Firebird DBMS ist eine Abkehr vom traditionellen relationalen Modell. Unterstützung von Arrays im DBMS könnte es einfacher machen, Datenverarbeitungsaufgaben mit großen Mengen von ähnlichen Daten zu lösen.

Array werden in Firebird mittels speziellen BLOB-Typen gespeichert. Arrays können ein- und multidimensional sein. Sie dürfen aus beliebigen Datentypen, außer BLOB und ARRAY bestehen.

Beispiel: 

       CREATE TABLE SAMPLE_ARR (
           ID INTEGER NOT NULL PRIMARY KEY,
           ARR_INT INTEGER [4]);
        

Dieses Beispiel erstellt eine Tabelle mit einem Array-Feld, welches 4 Ganzzahlenelemente (Integer) enthält. Die Indizes werden von 1 bis 4 gezählt.

Festlegen expliziter Dimensionsgrenzen

Standardmäßig sind die Indizes 1-basierend—Zählung begind bei 1. Um die Ober- und Untergrenzen explizit festzulegen, nutzen Sie folgende Syntax:

       [<lower>:<upper>]
          

Weitere Dimensionen hinzufügen

Eine neue Dimension wird nach dem Komma in der Syntax hinzugefügt. In diesem Beispiel erstellen wir eine Tabelle mit einem zweidimensionalen Array, mit der unteren Indizegrenze von 0 beginnend:

       CREATE TABLE SAMPLE_ARR2 (
           ID INTEGER NOT NULL PRIMARY KEY,
           ARR_INT INTEGER [0:3, 0:3]);
          

Das DBMS bietet, im Vergleich mit anderen Sprachen oder Werkzeugen, nicht viele Möglichkeiten zur Arbeit mit Array-Inhalten. Die Datenbank employee.fdb, die im Unterverzeichnis ../examples/empbuild jedes Firebird-Pakets gefunden werden kann, beinhaltet eine beispielhafte Gespeicherte Prozedur (stored procedure), die einfache Routinen im Umgang mit Arrays zeigt:

PSQL Quelltext für SHOW_LANGS, eine Prozedur zur Arbeit mit Arrays: 

    CREATE OR ALTER PROCEDURE SHOW_LANGS (
        CODE VARCHAR(5),
        GRADE SMALLINT,
        CTY VARCHAR(15))
      RETURNS (LANGUAGES VARCHAR(15))
      AS
        DECLARE VARIABLE I INTEGER;
      BEGIN
         I = 1;
         WHILE (I <= 5) DO
         BEGIN
            SELECT LANGUAGE_REQ[:I]
            FROM JOB
            WHERE (JOB_CODE = :CODE)
              AND (JOB_GRADE = :GRADE)
              AND (JOB_COUNTRY = :CTY)
              AND (LANGUAGE_REQ IS NOT NULL))
            INTO :LANGUAGES;

            IF (LANGUAGES = '') THEN
            /* 'NULL' anstelle von Leerzeichen ausgeben */
              LANGUAGES = 'NULL';
            I = I +1;
            SUSPEND;
         END
      END
        

Reichen die beschriebenen Features für Ihre Aufgaben aus, können Sie darüber nachdenken, Arrays in Ihrem Projekt zu verwenden. Derzeit planen die Firebird-Entwickler keine Verbesserungen im Bereich Arrays.

Zurück: ZeichendatentypenFirebird Documentation IndexNach oben: Datentypen und UnterdatentypenWeiter: Spezialdatentypen
Firebird Documentation IndexFirebird 2.5 SprachreferenzDatentypen und Unterdatentypen → Binärdatentypen