Firebird Documentation IndexFirebird 2.5 SprachreferenzDatentypen und Unterdatentypen → Zeichendatentypen
Firebird Home Firebird Home Zurück: Datentypen für Datum und ZeitFirebird Documentation IndexNach oben: Datentypen und UnterdatentypenWeiter: Binärdatentypen

Zeichendatentypen

Inhaltsverzeichnis

Unicode
Client-Zeichensatz
Spezielle Zeichensätze
COLLATION
Zeichenindizes
Zeichendatentypen im Detail

Für die Arbeit mit Zeichendaten bietet Firebird die Datentypen CHAR mit Festlänge und VARCHAR mit variabler Zeichenlänge. Die Maximalgröße der hiermit speicherbaren Daten beträgt 32.767 Bytes für CHAR und 32.765 Bytes für VARCHAR. Das Maximum der möglichen Zeichen, das in diese Grenzen passt, hängt vom verwendeten Zeichensatz (CHARACTER SET) ab. Die Sortiermethode COLLATE wirkt sich nicht auf die Maximalgrenze aus, wohingegen sie durchaus die maximale Größe eines Indexes auf dieser Spalte beeinflussen kann.

Wurde während der Definition eines Zeichenobjektes kein expliziter Zeichensatz festgelegt, wird der Standardzeichensatz der Datenbank verwendet. Wurde für die Datenbank kein Standardzeichensatz festgelegt, erhält das Feld den Zeichensatz NONE.

Unicode

Die meisten aktuellen Entwicklertools unterstützen Unicode, welches in Firebird mit den Zeichensätzen UTF8 und UNICODE_FSS integriert ist. UTF8 bietet Sortierungen für viele Sprachen. UNICODE_FSS ist deutlich begrenzter und wird hauptsächlich intern durch Firebird für das Speichern von Metadaten verwendet. Beachten Sie, dass ein UTF8-Zeichen bis zu 4 Bytes beanspruchen kann, wodurch die Größe von CHAR-Feldern auf 8.191 Zeichen reduziert werden kann (32.767/4).

Anmerkung

Der genaue Wert der „Bytes pro Zeichen“ hängt vom Bereich des Zeichens ab. Nicht-akzentuierte Latin-Buchstaben beanspruchen 1 Byte, kyrillische Zeichen mit WIN1251-Enkodierung beanspruchen 2 Bytes, andere Zeichenenkodierungen können bis zu 4 Bytes beanspruchen.

Der in Firebird implementierte UTF8-Zeichensatz, unterstützt die aktuellste Version des Unicode-Standards. Somit ist dieser für internationale Datenbanken empfohlen.

Client-Zeichensatz

Während der Arbeit mit Zeichenketten, ist es notwendig, den Zeichensatz des Clients zu berücksichtigen. Sollte eine Diskrepanz zwischen den Zeichensätzen der gespeicherten Daten und der Clientverbindung existieren, werden Ausgaben für Textfelder automatisch neu enkodiert. Dies gilt für Daten, die vom Client zum Server gesendet werden und anders herum. Wurde die Datenbank beispielsweise mit WIN1251 enkodiert, der Client verwendet jedoch KOI8R oder UTF8, stellt sich die Diskrepanz transparent dar.

Spezielle Zeichensätze

Zeichensatz NONEDer Zeichensatz NONE ist ein Spezialzeichensatz in Firebird. Er kann so beschrieben werden, als wäre jedes Byte Teil einer Zeichenkette, die jedoch keine Angaben zur Beschreibung eines Zeichens macht: Zeichenenkodierung, Sortierung, Klein- und Großschreibung, etc. sind einfach unbekannt. Es liegt in der Verantwortung der Client-Anwendung mit den Daten umzugehen und die richtigen Mittel bereitzustellen, um die Folge von Bytes in irgendeiner Weise interpretieren zu können, die für die Anwendung sinnvoll sind und für den Menschen lesbar.

Zeichensatz OCTETSDaten der OCTETS-Enkodierung werden als Bytes behandelt, die nicht direkt als Zeichen interpretiert werden. OCTETS bieten einen Weg um Binärdaten zu speichern, was die Ergebnisse einiger Firebird-Funktionen sein könnten. Die Datenbank weiß nicht was mit einer Zeichenkette aus Bits in OCTETS zu tun ist, außer diese zu speichern und abzufragen. Auch hier ist wieder der Client verantwortlich für die Validierung der Daten und diese sowohl der Anwendung wie auch dem Benutzer in verständlicher Form anzuzeigen. Dies gilt auch für Ausnahmen, die durch die Enkodierung und Dekodierung verursacht werden.

COLLATION

Jeder Zeichensatz hat eine Standardsortiermethode (COLLATE). Üblicherweise stellt diese nicht mehr bereit als die Reihenfolge basierend auf einem numerischen Code der Zeichen und einer Basiszuordnung der Klein- und Großbuchstaben. Wird ein Verhalten außerhalb der Collation benötigt und eine alternative Methode für den Zeichensatz unterstützt, kann eine COLLATE Sortier-Klausel in der Felddefinition verwendet werden.

Eine COLLATE Sortier-Klausel kann auch in anderen Zusammenhängen neben der Spaltendefinition angewandt werden. Für größer-als-/kleiner-als-Vergleiche, kann sie in die WHERE-Klausel des SELECT-Statements aufgenommen werden. Wird eine speziell alphabetisch geordnete oder Groß- und Kleinschreibungsinsensitive Ausgabe benötigt, und sollte eine passende Collation existieren, dann kann die COLLATE-Klausel auch in der ORDER BY-Klausel verwendet werden.

Groß- und Kleinschreibungsinsensitive Suche

Für die Groß- und Kleinschreibungsinsensitive Suche, kann die Funktion UPPER verwendet werden, damit das Suchargument und der die gesuchte Zeichenkette in Großbuchstaben gewandelt werden, bevor der Vergleich stattfindet:

         …
         where upper(name) = upper(:flt_name)
          

Für Zeichenketten eines Zeichensatzes, der keine Groß- und Kleinschreibungsinsensitive Sortierung bereitstellt, können sie die Sortierung anwenden, um das Suchargument und die gesuchte Zeichenkette direkt miteinander zu vergleichen. Beispielsweise ist unter dem Zeichensatz WIN1251 die Sortierung PXW_CYRL Groß- und Kleinschreibungsinsensitiv. Somit gilt:

         …
         WHERE FIRST_NAME COLLATE PXW_CYRL >= :FLT_NAME
         …
         ORDER BY NAME COLLATE PXW_CYRL
          

Vgl. auch: CONTAINING

UTF8-Collation

Die folgende Tabelle zeigt mögliche Sortiermethoden für den UTF8-Zeichensatz.

Tabelle 3.4. Collation für den Zeichensatz UTF8

Sortierung Merkmale
UCS_BASIC Sortierung arbeitet abhängig von der Position des Zeichens in der Tabelle (binär). Hinzugefügt in Firebird 2.0
UNICODE Sortierung arbeitet abhängig vom UCA-Algorithmus (Unicode Collation Algorithm) (alphabetisch). Hinzugefügt in Firebird 2.0
UTF8 Die Standard-Sortierung, binär, identisch zu UCS_BASIC, welche im Rahmen der SQL-Kompatibilität hinzugefügt wurde.
UNICODE_CI Groß- und Kleinschreibungsinsensitive Sortierung, arbeitet ohne Groß- und Kleinschreibung zu berücksichtigen. Hinzugefügt in Firebird 2.1
UNICODE_CI_AI Groß- und Kleinschreibungsunabhängige, akzentunabhängige Sortierung, die weder Groß- und Kleinschreibung noch Akzentuierung von Zeichen berücksichtigt. Arbeitet alphabetisch. Hinzugefügt in Firebird 2.5


Beispiel: Ein Beispiel einer Sortierung für den UTF8-Zeichensatz ohne Berücksichtigung der Groß- und Kleinschreibung oder Akzentuierung der Zeichen (ähnlich zu COLLATE PXW_CYRL).

       ...
       ORDER BY NAME COLLATE UNICODE_CI_AI
            

Zeichenindizes

In Firebird-Versionen vor 2.0 kann es zu Problemen beim Erstellen eines Index für Zeichenspalten kommen, die eine außergewöhnliche Collation nutzen: die Länge eines indizierten Feldes ist auf 252 Bytes beschränkt, sofern kein COLLATE spezifiziert wurde, andernfalls sind es 84 Bytes. Multi-Byte-Zeichensätze schränken die Indizes weiter ein.

Ab Firebird 2.0 beschränkt sich die Indexlänge auf ein Viertel der Seitengröße (page size), z.B. von 1.024 bis 4.096 Bytes. Die größtmögliche Länge einer indizierten Zeichenkette liegt bei 9 Bytes weniger als die Viertel-Seiten-Grenze.

Berechnung der maximalen Länge eines indizierten Zeichenfeldes: Die folgende Formel berechnet der maximale Länge eines indizierten Zeichenfeldes (in Zeichen):

       max_char_length = FLOOR((page_size / 4 - 9) / N)
        

wobei N die Anzahl der Bytes pro Zeichen im Zeichensatz darstellt.

Die folgende Tabelle zeigt die Maximallänge einer indizierten Zeichenkette (in Zeichen), abhängig von der Seitengröße und Zeichensatz. Die Maximallänge wurde mittels der o.a. Formel berechnet.

Tabelle 3.5. Maximale Indexlänge nach Seitengröße und Zeichengröße

Seitengröße (Page Size) Maximale Länge einer indizierten Zeichenkette für ein Zeichen, Bytes / Zeichen
1 2 3 4 6
4.096 1.015 507 338 253 169
8.192 2.039 1.019 679 509 339
16.384 4.087 2.043 1.362 1.021 682


Anmerkung

Mit Collations („_CI“), die Groß- und Kleinschreibungsinsensitiv sind, wird ein Zeichen im Index nicht 4, sondern 6 Bytes, beanspruchen. Hierdurch wird die maximale Schlüssellänge für eine Seitengröße von zum Beispiel 4.096 Bytes auf 169 Zeichen begrenzt.

Vergleichen Sie auch:  CREATE DATABASE, COLLATION, SELECT, WHERE, GROUP BY, ORDER BY

Zeichendatentypen im Detail

Inhaltsverzeichnis

CHAR
VARCHAR
NCHAR

CHAR

CHAR ist ein Festlängen-Datentyp. Ist die eingegebene Anzahl der Zeichen kleiner als die definierte Länge, werden Leerzeichen zu dem Feld hinzugefügt. Grundsätzlich muss das Füllzeichen kein Leerzeichen sein: dies hängt vom Zeichensatz ab. So ist das Füllzeichen für den OCTETS-Zeichensatz beispielsweise die Null.

Der volle Name dieses Datentyps ist CHARACTER, es ist jedoch nicht erforderlich volle Namen zu verwenden und die Leute tun dies auch sehr selten.

Daten für Festlängen-Zeichen können verwendet werden, um Codes zu speichern, deren Länge standardisiert ist und die eine definierte „Breite“ besitzen. Ein Beispiel hierfür ist ein EAN13-Barcode—13 Zeiche, alle gefüllt.

Syntax für die Deklaration: 

       CHAR [(length)] [CHARACTER SET <set>] [COLLATE <name>]
          

Anmerkung

Wurde keine Länge (length) angegeben, wird 1 verwendet.

Eine gültige Länge (length) befindet sich im Bereich von 1 bis maximal so vielen Zeichen, die in 32,767 Bytes passen.

VARCHAR

VARCHAR ist der Standarddatentyp zum Speichern von Texten variabler Länge. Die Zeichen müssen in 32.765 Bytes passen. Die Speicherstruktur ist identisch mit der aktuellen Datengröße plus 2 Bytes.

Alle Zeichen, die von der Client-Anwendung an die Datenbank gesendet werden, werden als sinnvoll erachtet, was auch für führende und nachrangige Leerzeichen gilt. Jedoch werden angestellte Leerzeichen nicht gespeichert: Sie werden wiederhergestellt, sobald die Daten abgerufen werden. Die Zeichenkette wird dann bis zu der gespeicherten Länge mit dem Leerzeichen aufgefüllt.

Der volle Name dieses Datentyps ist CHARACTER VARYING. Eine weitere Variante dieses Namens wird auch mit CHAR VARYING bezeichnet.

Syntax: 

       VARCHAR (length) [CHARACTER SET <set>] [COLLATE <name>]
          

NCHAR

NCHAR ist ein Festlängen-Datentyp. Der ISO8859_1-Zeichensatz ist vordefiniert. In allen anderen Bezügen verhält sich dieser Datentyp identisch zu CHAR.

Syntax: 

       NCHAR (length)
          

Das Synonym hierfür ist NATIONAL CHAR. Für variable Längen gibt es einen ähnlichen Datentyp: NATIONAL CHARACTER VARYING.

Zurück: Datentypen für Datum und ZeitFirebird Documentation IndexNach oben: Datentypen und UnterdatentypenWeiter: Binärdatentypen
Firebird Documentation IndexFirebird 2.5 SprachreferenzDatentypen und Unterdatentypen → Zeichendatentypen