Datatyper som stöds

Till skillnad från de flesta SQL-databaser kräver eller tvingar inte Adobe AIR SQL-databasen att tabellkolumnvärden har en viss typ. I stället används i körtidsbiblioteket två koncept, lagringsklasser och kolumntillhörighet, för att styra datatyperna. Det här avsnittet beskriver lagringsklasser och kolumntillhörighet och hur datatypsskillnader kan lösas i olika situationer:

Lagringsklasser

Lagringsklasser representerar befintliga datatyper som används för att lagra värden i en databas. Följande lagringsklasser används i databasen:

NULL
Värdet är ett NULL-värde.

INTEGER
Värdet är ett positivt eller negativt heltal.

REAL
Värdet är ett reellt flyttal.

TEXT
Värdet är en textsträng (begränsad till 256 MB).

BLOB
Värdet är ett BLOB-objekt (Binary Large Object), dvs. binära rådata (begränsat till 256 MB).

Alla värden som skickas till databasen som literaler inbäddade i SQL-programsatser eller bundna värden med parametrar till en förberedd SQL-programsats är tilldelade en lagringsklass innan SQL-programsatsen körs.

Literaler som är en del av en SQL-programsats tilldelas lagringsklassen TEXT om de står inom enkla eller dubbla citattecken, INTEGER om literalen är specificerad som en siffra utan citattecken och utan decimaltecken eller exponent, REAL om literalen är en siffra utan citattecken med ett decimaltecken, eller exponent eller NULL, om värdet är NULL. Literaler med lagringsklassen BLOB specificeras med notationen X'ABCD'. Mer information finns i Literala värden i uttryck.

Värden som ges som parametrar med SQLStatement.parameters tilldelas den lagringsklass som närmast matchar en intern datatypsgräns. Till exempel är integer-värden bundna till lagringsklassen INTEGER, numeriska värden ges lagringsklassen REAL, strängvärden ges lagringsklassen TEXT och ByteArray-objekt ges lagringsklassen BLOB.

Kolumntillhörighet

En kolumns tillhörighet är den rekommenderade datatypen i den kolumnen. När ett värde lagras i en kolumn (via INSERT eller UPDATE), försöker körtidsbiblioteket att konvertera det värdet från den faktiska datatypen till den specificerade tillhörigheten. Om till exempel ett värde med datatypen DATE (en ActionScript- eller JavaScript-instans) infogas i en kolumn vars tillhörighet är TEXT, kommer datumvärdet att konverteras till strängrepresentation (motsvarande anrop av objektets toString()-metod) innan värdet lagras i databasen. Om värdet inte kan konverteras till den specificerade tillhörigheten inträffar ett fel och åtgärden utförs inte. När ett värde hämtas från databasen med SELECT, returneras den som en instans av den klass som motsvarar tillhörigheten oavsett om den konverterades från en annan datatyp när den lagrades.

Om en kolumn accepterar NULL-värden, kan ActionScript- eller JavaScript-värdet null användas som ett parametervärde för att lagra NULL i kolumnen. När ett värde med lagringsklassen NULL hämtas med SELECT, returneras det som ActionScript- eller JavaScript-värdet null, oavsett kolumnens tillhörighet. Om en kolumn accepterar NULL-värden, måste du alltid kontrollera de värden som hämtas från den kolumnen för att bestämma om de är null innan du försöker konvertera värdet till en typ som inte kan vara null (som ett numeriskt eller ett booleskt värde).

Varje kolumn i databasen tilldelas en av följande typtillhörigheter:

  • TEXT (eller String)

  • NUMERIC

  • INTEGER (eller int)

  • REAL (eller Number)

  • Boolean

  • Date

  • XML

  • XMLLIST

  • Object

  • NONE

TEXT (eller String)

En kolumn med tillhörigheterna TEXT eller String lagrar alla data med lagringsklasserna NULL, TEXT eller BLOB. Om numeriska data infogas i en kolumn med tillhörigheten TEXT, konverteras de till textform innan de lagras.

NUMERIC

En kolumn med tillhörigheten NUMERIC innehåller värden där lagringsklasserna NULL, REAL eller INTEGER används. När textdata infogas i en NUMERIC-kolumn, görs ett försök att konvertera värdet till ett heltal eller till ett reellt tal innan det lagras. Om konvertering genomförs, lagras värdet med hjälp av lagringsklasserna INTEGER eller REAL (till exempel konverteras värdet '10,05' till lagringsklassen REAL innan det lagras). Om konverteringen inte kan utföras uppstår ett fel. Inget försök görs att konvertera ett NULL-värde. Ett värde som hämtas från en NUMERIC-kolumn returneras som en instans av den mest specifika numeriska typen till vilken värdet passar. Om värdet är ett positivt heltal eller 0, returneras det alltså som en uint-instans. Om det är ett negativt heltal, returneras det som en int-instans. Om värdet har en flyttalskomponent (värdet är inte ett heltal), returneras det som en Number-instans.

INTEGER (eller int)

En kolumn som använder tillhörigheten INTEGER fungerar på samma sätt som en kolumn med NUMERIC-tillhörighet, fast med ett undantag. Om värdet som ska lagras är ett reellt värde (som en instans av Number) utan flyttalskomponent, eller om värdet är ett textvärde som kan konverteras till ett reellt värde utan flyttalskomponent, konverteras det till ett heltal och lagras med lagringsklassen INTEGER. Om ett försök görs att lagra ett reellt värde med en flyttalskomponent uppstår ett fel.

REAL (eller Number)

En kolumn med tillhörigheten REAL eller NUMBER fungerar på samma sätt som en kolumn med tillhörigheten NUMERIC, förutom att den tvingar heltalsvärden till flyttalsrepresentation. Ett värde i en REAL-kolumn returneras alltid från databasen som en Number-instans.

Boolean

En kolumn med tillhörigheten Boolean lagrar sanna eller falska värden. En Boolean-kolumn accepterar ett värde som är en ActionScript- eller JavaScript-instans av Boolean. Om koden försöker lagra ett strängvärde, betraktas ett strängvärde med en längd större än noll som sann och en tom sträng som falsk. Om koden försöker lagra numeriska data, lagras värden som inte är noll som sanna och 0 lagras som falskt. När ett booleskt värde hämtas med SELECT, returneras värdet som en Boolean-instans. NULL-skilda värden lagras med lagringsklassen INTEGER (0 för falskt och 1 för sant) och konverteras till Boolean-objekt när data hämtas.

Date

En kolumn med tillhörigheten Date lagrar datum och tid. En Date-kolumn är avsedd att acceptera värden som är ActionScript- eller JavaScript-instanser av Date. Om försök görs att lagra ett strängvärde i en Date-kolumn, försöker körtidsbiblioteket konvertera värdet till ett julianskt datum. Om konverteringen misslyckas uppstår ett fel. Om koden försöker att lagra ett värde av typen Number, int eller uint, görs inga försök att validera data och värdet betraktas som ett giltigt julianskt datumvärde. Ett Date-värde som hämtas med SELECT konverteras automatiskt till en Date-instans. Date-värden lagras som julianska datumvärden med lagringsklassen REAL, och sorterings- och jämförelseåtgärder fungerar som förväntat.

XML eller XMLList

En kolumn som använder tillhörigheten XML- eller XMLList lagrar XML-strukturer. Om koden försöker lagra data i en XML-kolumn med en SQLStatement-parameter, försöker körtidsbiblioteket att konvertera och validera värdet med ActionScript-funktionen XML() eller XMLList(). Ett fel uppstår om värdet inte kan konverteras till giltig XML. Om försöket att lagra data använder ett literalt SQL-textvärde (till exempel INSERT INTO (col1) VALUES ('Invalid XML (ingen avslutningstagg)'), undersöks eller valideras inte värdet, utan textvärdet antas att vara välformad XML. Om ett ogiltigt värde lagras, returneras det när det hämtas som ett tomt XML-objekt. XML- och XMLList-data lagras med lagringsklassen TEXT eller NULL.

Object

En kolumn med tillhörigheten Object lagrar ActionScript- eller JavaScript-objekt som är komplexa, inklusive objektklassinstanser och instanser av programsatser för underklasser som arrayer och anpassade klassinstanser. Object-kolumndata är serialiserade i AMF3-format och lagras med lagringsklassen BLOB. När ett värde hämtas, deserialiseras det från AMF3 och returneras som en instans av samma klass som när den lagrades. Observera att några ActionScript-klasser, speciellt visningsobjekt, inte kan deserialiseras som instanser av deras originaldatatyp. Innan du lagrar en egen klassinstans måste du registrera ett alias för klassen med metoden flash.net.registerClassAlias() (eller i Flex genom att lägga till [RemoteObject]-metadata i klassdeklarationerna). Dessutom måste du innan du hämtar data registrera samma alias för klassen. Data som inte kan deserialiseras ordentligt, antingen på grund av att klassen inte kan deserialiseras eller att klassalias saknas eller är felkopplade, returneras som ett anonymt objekt (en Object-klassinstans) med egenskaper och värden som motsvarar den lagrade originalinstansen.

NONE

En kolumn med tillhörigheten NONE föredrar inte en viss lagringsklass framför en annan. Det görs inga försök att konvertera data innan de infogas.

Bestämma tillhörighet

Typtillhörigheten för en kolumn bestäms av den deklarerade typen för kolumnen i programsatsen CREATE TABLE. När typen bestäms gäller följande regler (inte skiftlägeskänsliga):

  • Om kolumnens datatyp innehåller några av strängarna CHAR, CLOB, STRI eller TEXT har kolumnen tillhörigheten TEXT/String. Observera att typen VARCHAR innehåller strängen CHAR och därför tilldelas tillhörigheten TEXT.

  • Om kolumnens datatyp innehåller strängen BLOB, eller om ingen datatyp är specificerad, har kolumnen tillhörigheten NONE.

  • Om datatypen för kolumnen innehåller strängen XMLL, har kolumnen tillhörigheten XMLList.

  • Om datatypen är strängen XML, har kolumnen tillhörigheten XML.

  • Om datatypen innehåller strängen OBJE, har kolumnen tillhörigheten Object.

  • Om datatypen innehåller strängen BOOL, har kolumnen tillhörigheten Boolean.

  • Om datatypen innehåller strängen DATE, har kolumnen tillhörigheten Date.

  • Om datatypen innehåller strängen INT (inklusive UINT) ges den tillhörigheten INTEGER/int.

  • Om kolumnens datatyp innehåller några av strängarna REAL, NUMB, FLOA eller DOUB får kolumnen tillhörigheten REAL/Number.

  • I annat fall är tillhörigheten NUMERIC.

  • Om en tabell skapas med CREATE TABLE t AS SELECT... har inga kolumner en specificerad datatyp och de får samtliga tillhörigheten NONE.

Datatyper och jämförelseoperatorer

Följande binära jämförelseoperatorer =, <, <=, >= och != stöds tillsammans med en åtgärd för att testa för mängdmedlemskap IN och den ternära jämförelseoperatorn BETWEEN. Mer information om dessa operatorer finns i Operatorer.

Resultatet av en jämförelse beror på lagringsklasserna för de två värden som jämförs. Följande regler gäller när två värden jämförs:

  • Ett värde med lagringsklassen NULL betraktas som mindre än vilket annat värde som helst (inklusive ett annat värde med lagringsklassen NULL).

  • Ett INTEGER- eller REAL-värde är mindre än värdena TEXT eller BLOB. Om en INTEGER eller REAL jämförs med en annan INTEGER eller REAL, utförs en numerisk jämförelse.

  • Ett TEXT-värde är mindre än ett BLOB-värde. När två TEXT-värden jämförs, utförs en binär jämförelse.

  • När två BLOB-värden jämförs, bestäms alltid resultatet med hjälp av en binär jämförelse.

Den ternära operatorn BETWEEN typkonverteras alltid som det motsvarande binära uttrycket. Till exempel konverteras a BETWEEN b AND c till a >= b AND a <= c, även om det innebär att olika tillhörigheter ges till a i varje jämförelse som kräver evaluering av uttrycket.

Uttryck av typen a IN (SELECT b ....) hanteras av de tre reglerna som har beskrivits tidigare för binära jämförelser, det vill säga på liknande sätt som a = b. Exempel: Om b är ett kolumnvärde och a är ett uttryck, tillämpas tillhörigheten för b på a innan jämförelsen utförs. Uttrycket a IN (x, y, z) konverteras till a = +x OR a = +y OR a = +z. Värdena till höger om operatorn IN (värdena x, y och z i det här exemplet) betraktas som uttryck, även om de råkar vara kolumnvärden. Om värdet till vänster om operatorn IN är en kolumn, används kolumnens tillhörighet. Om värdet är ett uttryck sker ingen konvertering.

Hur jämförelser utförs kan även påverkas av en COLLATE-sats. Mer information finns i COLLATE.

Datatyper och matematiska operatorer

För varje matematisk operator som stöds, *, /, %, + och -, tillämpas en numerisk tillhörighet på varje operand innan uttrycket evalueras. Om en operand inte kan konverteras till lagringsklassen NUMERIC evalueras uttrycket till NULL.

När sammanfogningsoperatorn || används, konverteras varje operand till lagringsklassen TEXT innan uttrycket evalueras. Om en operand inte kan konverteras till lagringsklassen TEXT, blir resultatet av uttrycket NULL. Det kan i två situationer förekomma svårigheter konvertera värdet, om värdet av operanden är NULL, eller om en BLOB innehåller en annan lagringsklass än TEXT.

Datatyper och sortering

När värden sorteras med en ORDER BY-sats, kommer värden med lagringsklassen NULL först. Dessa följs av INTEGER- och REAL-värden i numerisk ordning, följt av TEXT-värden i binär ordning eller baserat på den specificerade kollationen (BINARY eller NOCASE). Slutligen kommer BLOB-värden i binär ordning. Ingen konvertering av lagringsklasser sker före sortering.

Datatyper och gruppering

Vid gruppering av värden med GROUP BY betraktas värden med skilda lagringsklasser som olika. Ett undantag är INTEGER- och REAL-värden som betraktas som lika om de är numeriskt lika. Inga tillhörigheter tillämpas på värden som ett resultat av en GROUP BY-sats.

Datatyper och sammansatta SELECT-programsatser

De sammansatta SELECT-operatorerna UNION, INTERSECT och EXCEPT används för att utföra implicita jämförelser mellan värden. Innan dessa jämförelser utförs måste varje värde ges en tillhörighet. Samma tillhörighet, om någon, tillämpas på alla värden som eventuellt returneras i en enda kolumn i den sammansatta SELECT-resultatmängden. Tillhörigheten som tillämpas är tillhörigheten för den kolumn som returneras av den första komponenten i SELECT-programsatsen som har ett kolumnvärde (och inte något annat uttryck) i det läget. Om det för en given sammansatt SELECT-kolumn inte returneras någon komponent av en ingående SELECT-programsats, tillämpas ingen tillhörighet på värden från den kolumnen innan de jämförs.