Anders als die meisten SQL-Datenbanken erfordert oder erzwingt die SQL-Datenbank-Engine von Adobe AIR nicht, das Tabellenspalten Werte eines bestimmten Typs enthalten. Stattdessen verwendet die Laufzeitumgebung zwei Konzepte, Speicherklassen und Spaltenaffinität, um Datentypen zu steuern. In diesem Abschnitt werden Speicherklassen und Spaltenaffinität beschrieben. Außerdem wird die Auflösung von Datentypunterschieden unter verschiedenen Bedingungen erläutert:
Speicherklassen
Speicherklassen repräsentieren die aktuellen Datentypen, die zum Speichern von Werten in einer Datenbank verwendet werden. Die folgenden Speicherklassen werden von der Datenbank verwendet:
-
NULL
-
Der Wert ist ein NULL-Wert.
-
INTEGER
-
Der Wert ist eine vorzeichenbehaftete Ganzzahl.
-
REAL
-
Der Wert ist eine Gleitpunktzahl.
-
TEXT
-
Der Wert ist ein Textstring (begrenzt auf 256 MB).
-
BLOB
-
Der Wert ist ein BLOB-Objekt (Binary Large Object, binäres großes Objekt), es handelt sich also um unformatierte Binärdaten (begrenzt auf 256 MB).
Alle Werte, die der Datenbank als Literale bereitgestellt werden, die in eine SQ-Anweisung eingebettet sind, oder Werte, die mithilfe von Parametern an eine vorbereitete SQL-Anweisung gebunden sind, werden einer Speicherklasse zugewiesen, bevor die SQL-Anweisung ausgeführt wird.
Literale, die Teil einer SQL-Anweisung sind, werden den folgenden Speicherklassen zugewiesen: TEXT, wenn sie in einfachen oder doppelten Anführungszeichen stehen; INTEGER, wenn das Literal als Teil einer Zahl ohne Anführungszeichen und ohne Dezimaltrennzeichen oder Exponent angegeben ist; REAL, wenn das Literal eine Zahl ohne Anführungszeichen mit einem Dezimaltrennzeichen oder Exponent ist; NULL, wenn der Wert NULL ist. Literale mit der BLOB-Speicherklasse werden mit der Schreibweise X'ABCD' angegeben. Weitere Informationen finden Sie unter „Literalwerte in Ausdrücken“.
Werte, die mit dem assoziativen SQLStatement.parameters-Array als Parameter bereitgestellt werden, werden der Speicherklasse zugewiesen, die der nativen Datentypbindung am nächsten kommt. Zum Beispiel werden int-Werte als INTEGER-Speicherklasse gebunden, Number-Werte bekommen die REAL-Speicherklasse, String-Werte bekommen die TEXT-Speicherklasse und ByteArray-Objekte bekommen die BLOB-Speicherklasse.
Spaltenaffinität
Die
Affinität
einer Spalte ist der empfohlene Typ für Daten, die in dieser Spalte gespeichert werden. Wenn ein Wert in einer Spalte gespeichert wird (über eine INSERT- oder UPDATE-Anweisung), versucht die Laufzeitumgebung, den Wert von seinem Datentyp in die angegebene Affinität zu konvertieren. Wenn zum Beispiel ein Date-Wert (Datumswert; eine ActionScript- oder JavaScript-Date-Instanz) in eine Spalte eingefügt wird, deren Affinität TEXT ist, wird der Date-Wert in die Stringdarstellung konvertiert (äquivalent zum Aufrufen der toString()-Methode des Objekts), bevor er in der Datenbank gespeichert wird. Wenn der Wert nicht in die angegebene Affinität konvertiert werden kann, tritt ein Fehler auf und der Vorgang wird nicht ausgeführt. Wenn ein Wert mit einer SELECT-Anweisung aus der Datenbank abgerufen wird, wird er als Instanz der Klasse, die der Affinität entspricht, zurückgegeben, unabhängig davon, ob er beim Speichern aus einem anderen Datentyp konvertiert wurde.
Wenn eine Spalte NULL-Werte akzeptiert, kann der ActionScript- oder JavaScript-Wert null als Parameterwert verwendet werden, um NULL in der Spalte zu speichern. Wenn in einer SELECT-Anweisung ein Speicherklassenwert NULL abgerufen wird, wird er immer als der ActionScript- oder JavaScript-Wert null zurückgegeben, unabhängig von der Affinität der Spalte. Wenn eine Spalte NULL-Werte akzeptiert, überprüfen Sie immer die Werte, die aus dieser Spalte abgerufen werden, um festzustellen, ob sie null sind, bevor Sie versuchen, die Werte in einen nicht null-fähigen Typ (zum Beispiel Number oder Boolean) umzuformen.
Jeder Spalte in der Datenbank wird eine der folgenden Typaffinitäten zugewiesen:
-
TEXT (oder String)
-
NUMERIC
-
INTEGER (oder int)
-
REAL (oder Number)
-
Boolean
-
Date
-
XML
-
XMLLIST
-
Object
-
NONE
TEXT (oder String)
Eine Spalte mit TEXT- oder String-Affinität speichert alle Daten, die die Speicherklassen NULL, TEXT oder BLOB verwenden. Wenn numerische Daten in eine Spalte mit der TEXT-Affinität eingefügt werden, werden sie vor dem Speichern in Textform konvertiert.
NUMERIC
Eine Spalte mit der NUMERIC-Affinität enthält Werte, die die Speicherklassen NULL, REAL oder INTEGER verwenden. Wenn Textdaten in eine NUMERIC-Spalte eingefügt werden, wird versucht, sie in eine Ganzzahl oder reale Zahl zu konvertieren, bevor sie gespeichert werden. Ist die Konvertierung erfolgreich, wird der Wert mit der INTEGER- oder REAL-Speicherklasse gespeichert (der Wert '10.05' wird zum Beispiel vor dem Speichern in die REAL-Speicherklasse konvertiert). Ist die Konvertierung nicht möglich, kommt es zu einem Fehler. Es wird nicht versucht, einen NULL-Wert zu konvertieren. Ein Wert, der aus einer NUMERIC-Spalte abgerufen wird, wird als Instanz des numerischen Typs zurückgegeben, zu dem der Wert am ehesten passt. Anders ausgedrückt, wenn der Wert eine positive Ganzzahl oder 0 ist, wird er als uint-Instanz zurückgegeben. Wenn der Wert eine negative Ganzzahl ist, wird er als int-Instanz zurückgegeben. Hat der Wert eine Gleitpunktkomponente (ist er also keine Ganzzahl), wird er als Number-Instanz zurückgegeben.
INTEGER (oder int)
Eine Spalte, die die INTEGER-Affinität verwendet, verhält sich wie eine Spalte mit NUMERIC-Affinität, mit einer Ausnahme. Wenn der zu speichernde Wert ein realer Wert (zum Beispiel eine Number-Instanz) ohne Gleitkommakomponente ist oder wenn der Wert ein Textwert ist, der in einen realen Wert ohne Gleitkommakomponente konvertiert werden kann, wird er in eine Ganzzahl konvertiert und mit der INTEGER-Speicherklasse gespeichert. Wenn versucht wird, einen realen Wert mit einer Gleitkommakomponente zu speichern, kommt es zu einem Fehler.
REAL (oder Number)
Eine Spalte mit der REAL- oder NUMBER-Affinität verhält sich wie eine Spalte mit der NUMERIC-Affinität, außer dass sie die Gleitkommadarstellung von Ganzzahlwerten erzwingt. Ein Wert in einer REAL-Spalte wird von der Datenbank immer als Number-Instanz zurückgegeben.
Boolean
Eine Spalte mit Boolean-Affinität speichert true- oder false-Werte. Eine Boolean-Spalte akzeptiert einen Wert, der eine ActionScript- oder JavaScript-Boolean-Instanz ist. Wenn der Code versucht, einen String-Wert zu speichern, wird ein String mit einer Länge größer als null als true betrachtet und ein leerer String als false. Wenn der Code versucht, numerische Daten zu speichern, werden alle Nicht-Null-Werte als true und 0 als false gespeichert. Wenn ein boolescher Wert mit einer SELECT-Anweisung abgerufen wird, wird er als Boolean-Instanz zurückgegeben. Nicht-NULL-Werte werden mit der INTEGER-Speicherklasse gespeichert (0 für false und 1 für true) und in Boolean-Objekte konvertiert, wenn Daten abgerufen werden.
Date
Eine Spalte mit Date-Affinität speichert Datums- und Zeitwerte. Eine Date-Spalte nimmt Werte auf, die ActionScript- oder JavaScript-Date-Instanzen sind. Wenn versucht wird, einen Stringwert in einer Date-Spalte zu speichern, versucht die Laufzeitumgebung, ihn in ein julianisches Datum zu konvertieren. Ist die Konvertierung nicht möglich, kommt es zu einem Fehler. Wenn Code versucht, einen Number-, int- oder uint-Wert zu speichern, wird nicht versucht, die Daten zu validieren, und sie werden als gültiger Julianischer Datumswert betrachtet. Ein Date-Wert, der mit einer SELECT-Anweisung abgerufen wird, wird automatisch in eine Date-Instanz konvertiert. Date-Werte werden mit der REAL-Speicherklasse als julianische Datumswerte gespeichert; Sortier- und Vergleichsoperationen funktionieren also erwartungsgemäß.
XML oder XMLList
Eine Spalte mit XML- oder XMLList-Affinität speichert XML-Strukturen. Wenn Code versucht, Daten mit einem SQLStatement-Parameter in einer XML-Spalte zu speichern, versucht die Laufzeitumgebung, den Wert mit der ActionScript-Funktion XML() oder XMLList() zu konvertieren und zu validieren. Wenn der Wert nicht in gültigen XML-Code konvertiert werden kann, kommt es zu einem Fehler. Wenn beim Versuch, die Daten zu speichern, ein SQL-Literaltextwert verwendet wird (zum Beispiel INSERT INTO (col1) VALUES ('Invalid XML (no closing tag)'), wird der Wert weder analysiert noch validiert; stattdessen wird davon ausgegangen, dass der Wert ein gültiges Format aufweist. Wenn ein ungültiger Wert gespeichert wird, wird er beim Abrufen als leeres XML-Objekt zurückgegeben. XML- und XMLList-Daten werden mit der TEXT-Speicherklasse oder der NULL-Speicherklasse gespeichert.
Object
Eine Spalte mit Object-Affinität speichert komplexe ActionScript- oder JavaScript-Objekte, darunter Object-Klasseninstanzen sowie Instanzen von Object-Unterklassen wie Array-Instanzen und sogar Instanzen benutzerdefinierter Klassen. Object-Spaltendaten werden im AMF3-Format serialisiert und mit der BLOB-Speicherklasse gespeichert. Wenn ein Wert abgerufen wird, wird er aus dem AMF3-Format deserialisiert und als Instanz der Klasse, als die er gespeichert wurde, zurückgegeben. Beachten Sie, dass einige ActionScript-Klassen, insbesondere Anzeigeobjekte, nicht als Instanzen ihres ursprünglichen Datentyps deserialisiert werden. Bevor Sie Instanzen benutzerdefinierter Klassen speichern, müssen Sie einen Alias für die Klasse registrieren, indem Sie die flash.net.registerClassAlias()-Methode verwenden (oder in Flex [RemoteObject]-Metadaten zur Klassendeklaration hinzufügen). Bevor Sie diese Daten abrufen, müssen Sie denselben Alias für die Klasse registrieren. Alle Daten, die sich nicht korrekt deserialisieren lassen, weil die Klasse an sich nicht deserialisiert werden kann oder weil der Klassenalias fehlt bzw. nicht korrekt ist, werden als anonyme Objekte zurückgegeben (als Object-Klasseninstanz), mit Eigenschaften und Werten, die der ursprünglich gespeicherten Instanz entsprechen.
NONE
Eine Spalte mit NONE-Affinität bevorzugt keine bestimmte Speicherklasse. Es wird nicht versucht, Daten vor dem Einfügen zu konvertieren.
Bestimmen der Affinität
Der Affinitätstyp einer Spalte wird durch den in der CREATE TABLE-Anweisung deklarierten Spaltentyp bestimmt. Beim Bestimmen des Typs werden die folgenden Regeln angewendet (Groß- und Kleinschreibung wird nicht beachtet):
-
Wenn der Datentyp der Spalte den String "CHAR", "CLOB", "STRI" oder "TEXT" enthält, hat die Spalte die TEXT/String-Affinität. Beachten Sie, dass der Typ VARCHAR den String "CHAR" enthält; deshalb wird ihm die TEXT-Affinität zugewiesen.
-
Wenn der Datentyp der Spalte den String "BLOB" enthält oder wenn kein Datentyp angegeben ist, hat die Spalte die NONE-Affinität.
-
Wenn der Datentyp der Spalte den String "XMLL" enthält, hat die Spalte die XMLList-Affinität.
-
Wenn der Datentyp den String "XML" enthält, hat die Spalte die XML-Affinität.
-
Wenn der Datentyp den String "OBJE" enthält, hat die Spalte die Object-Affinität.
-
Wenn der Datentyp den String "BOOL" enthält, hat die Spalte die Boolean-Affinität.
-
Wenn der Datentyp den String "DATE" enthält, hat die Spalte die Date-Affinität.
-
Wenn der Datentyp den String "INT" (oder "UINT") enthält, gilt die INTEGER/int-Affinität.
-
Wenn der Datentyp der Spalte den String "REAL", "NUMB", "FLOA" oder "DOUB" enthält, hat die Spalte die REAL/Number-Affinität.
-
Andernfalls ist die Affinität NUMERIC.
-
Wenn eine Tabelle mit einer CREATE TABLE t AS SELECT...-Anweisung erstellt wird, wird für keine der Spalten ein Datentyp festgelegt und sie erhalten die NONE-Affinität.
Datentypen und Vergleichsoperatoren
Die folgenden binären Vergleichsoperatoren werden unterstützt: =, <, <=, >= und !=. Außerdem besteht Unterstützung für eine Operation zum Testen der set-Mitgliedschaft, für IN und für den tenären Vergleichsoperator BETWEEN. Weitere Informationen zu diesen Operatoren finden Sie unter „Operatoren“.
Die Ergebnisse eines Vergleichs sind von der Speicherklasse der beiden verglichenen Werte abhängig. Wenn zwei Werte verglichen werden, gelten die folgenden Regeln:
-
Ein Wert mit der NULL-Speicherklasse wird als kleiner als jeder andere Wert betrachtet (einschließlich anderer Werte mit der NULL-Speicherklasse).
-
Ein INTEGER- oder REAL-Wert wird als kleiner als jeder TEXT- oder BLOB-Wert betrachtet. Wenn ein INTEGER- oder REAL-Wert mit einem anderen INTEGER- oder REAL-Wert verglichen wird, wird ein numerischer Vergleich ausgeführt.
-
Ein TEXT-Wert ist kleiner als ein BLOB-Wert. Wenn zwei TEXT-Werte verglichen werden, wird ein binärer Vergleich ausgeführt.
-
Wenn zwei BLOB-Werte verglichen werden, wird das Ergebnis immer mithilfe eines binären Vergleichs ermittelt.
Der ternäre BETWEEN-Operator wird immer in den äquivalenten binären Ausdruck umgeformt. Beispielsweise wird „a BETWEEN b AND c“ in „a >= b AND a <= c“ umgewandelt, selbst wenn dies bedeutet, dass bei jedem der Vergleiche, die zum Auswerten des Ausdrucks erforderlich sind, eine andere Affinität auf „a“ angewendet wird.
Ausdrücke des Typs „a IN (SELECT b ....)“ werden gemäß den drei Regeln gehandhabt, die bereits für Binärvergleiche genannt wurden, also ähnlich wie „a = b“. Beispiel: Wenn „b“ ein Spaltenwert und „a“ ein Ausdruck ist, wird die Affinität von „b“ auf „a“ angewendet, bevor Vergleiche durchgeführt werden. Der Ausdruck „a IN (x, y, z)“ wird in die Form „a = +x OR a = +y OR a = +z“ umgewandelt. Die Werte rechts vom IN-Operator (in diesem Beispiel x, y und z) gelten als Ausdrücke, selbst wenn sie eigentlich Spaltenwerte sind. Wenn der Wert links des IN-Operators eine Spalte ist, wird die Affinität dieser Spalte verwendet. Wenn der Wert ein Ausdruck ist, findet keine Konvertierung statt.
Wie Vergleiche ausgeführt werden, kann auch von der Verwendung einer COLLATE-Klausel beeinflusst werden. Weitere Informationen finden Sie unter COLLATE.
Datentypen und mathematische Operatoren
Für jeden der unterstützten mathematischen Operatoren *, /, %, + und - wird die numerische Affinität auf jeden Operanden angewendet, bevor der Ausdruck evaluiert wird. Wenn ein Operand nicht erfolgreich in die NUMERIC-Speicherklasse konvertiert werden kann, wird der Ausdruck als NULL evaluiert.
Wenn der Verkettungsoperator || verwendet wird, wird jeder Operand in die TEXT-Speicherklasse konvertiert, bevor der Ausdruck evaluiert wird. Wenn ein Operand nicht in die TEXT-Speicherklasse konvertiert werden kann, ist das Ergebnis des Ausdrucks NULL. Es kann in zwei Situationen vorkommen, dass der Wert nicht konvertiert werden kann: wenn der Wert des Operanden NULL ist oder wenn es sich um ein BLOB handelt, das eine Nicht-TEXT-Speicherklasse enthält.
Datentypen und Sortierung
Wenn Werte durch eine ORDER BY-Klausel sortiert werden, stehen die Werte mit der NULL-Speicherklasse an erster Stelle. Danach folgen die INTEGER- und REAL-Werte in numerischer Reihenfolge, gefolgt von TEXT-Werten in binärer Reihenfolge oder nach der angegebenen Überprüfung (BINARY oder NOCASE) geordnet. Zum Schluss folgen die BLOB-Werte in binärer Reihenfolge. Vor der Sortierung werden keinen Klassenkonvertierungen ausgeführt.
Datentypen und Gruppierung
Wenn Werte mit der GROUP BY-Klausel gruppiert werden, werden Werte mit unterschiedlichen Speicherklassen als verschieden betrachtet. Eine Ausnahme sind INTEGER- und REAL-Werte, die als gleich betrachtet werden, wenn sie numerische Äquivalente sind. Auf Werte, die Ergebnis der GROUP BY-Klausel sind, werden keine Affinitäten angewendet.
Datentypen und zusammengesetzte SELECT-Anweisungen
Die zusammengesetzten SELECT-Operatoren UNION, INTERSECT und EXCEPT führen implizite Vergleiche zwischen Werten aus. Bevor diese Vergleiche ausgeführt werden, können auf die einzelnen Werte Affinitäten angewendet werden. Es wird dieselbe Affinität auf alle Werte angewendet, die in einer einzelnen Spalte des Ergebnissatzes des zusammengesetzten SELECT-Operators zurückgegeben werden. Die angewendete Affinität ist die Affinität der Spalte, die von der ersten Komponenten-SELECT-Anweisung zurückgegeben wird, die einen Spaltenwert an dieser Position hat (und keinen anderen Ausdruck). Wenn für eine bestimmte zusammengesetzte SELECT-Spalte keine der Komponenten-SELECT-Anweisungen einen Spaltenwert zurückgibt, wird keine Affinität auf die Werte dieser Spalte angewendet, bevor sie verglichen werden.
|
|
|