Supporto per i tipi di dati

A differenza della maggior parte dei database SQL, il motore di database SQL di Adobe AIR non richiede o impone che le colonne delle tabelle contengano valori di un determinato tipo. Al contrario, il runtime utilizza due concetti, ovvero classi di archiviazione e affinità delle colonne, per controllare i tipi di dati. In questa sezione vengono descritte le classi di archiviazione e l'affinità delle colonne, oltre al modo di risolvere le differenze dei tipi di dati in diverse condizioni:

Classi di archiviazione

Le classi di archiviazione rappresentano i dati effettivi che vengono utilizzati per archiviare i valori in un database. Le seguenti classi di archiviazione vengono utilizzate dal database:

NULL
Il valore è di tipo NULL.

INTEGER
Il valore è numero intero con segno.

REAL
Il valore è un numero a virgola mobile.

TESTO
Il valore è una stringa di testo (limitata a 256 MB).

BLOB
Il valore è un oggetto BLOB (Binary Large Object); in altre parole, dati binari originari (limitati a 256 MB).

A tutti i valori forniti al database come valori letterali incorporati in un'istruzione SQL, o i valori associati mediante parametri a un'istruzione SQL preparata, viene assegnata una classe di archiviazione prima dell'esecuzione dell'istruzione SQL.

Ai valori letterali che fanno parte di un'istruzione SQL viene assegnata la classe di archiviazione TEXT se sono racchiusi tra virgolette semplici o doppie, INTEGER se il valore letterale è specificato come numero senza virgolette, privo di separatore decimale o esponente, REAL se il valore letterale è un numero senza virgolette con un separatore decimale o un esponente e NULL se il valore è NULL. I valori letterali con la classe di archiviazione BLOB vengono specificati utilizzando la notazione X'ABCD'. Per ulteriori informazioni, vedete Valori letterali nelle espressioni.

Ai valori forniti come parametri utilizzando l'array associativo SQLStatement.parameters viene assegnata la classe di archiviazione che più si avvicina al tipo di dati nativo associato. I valori int, ad esempio, sono associati come classe di archiviazione INTEGER, ai valori Number viene assegnata la classe di archiviazione REAL, ai valori String viene assegnata la classe di archiviazione TEXT e agli oggetti ByteArray la classe di archiviazione BLOB.

Affinità delle colonne

L'affinità di una colonna è il tipo consigliato per l'archiviazione dei dati in quella colonna. Quando un valore viene archiviato in una colonna (tramite un'istruzione INSERT o UPDATE), il runtime tenta di convertire quel valore dal relativo tipo di dati nell'affinità specificata. Se ad esempio un valore Date (un'istanza Date ActionScript o JavaScript) viene inserito in una colonna la cui affinità è TEXT, il valore Date viene convertito nella rappresentazione in formato stringa (equivalente alla chiamata al metodo toString() dell'oggetto) prima di essere archiviato nel database. Se il valore non può essere convertito nell'affinità specificata, si verifica un errore e l'operazione non viene eseguita. Quando un valore viene recuperato dal database con un'istruzione SELECT, viene restituito come un'istanza della classe corrispondente all'affinità, indipendente dal fatto che sia stato convertito da un diverso tipo di dati al momento dell'archiviazione.

Se una colonna accetta i valori NULL, il valore ActionScript o JavaScript null può essere utilizzato come valore del parametro per archiviare NULL nella colonna. Quando si recupera un valore della classe di archiviazione NULL in un'istruzione SELECT, viene sempre restituito come valore ActionScript o JavaScript null, indipendentemente dall'affinità della colonna. Se una colonna accetta i valori NULL, controllate sempre i valori recuperati da quella colonna per determinare se sono null prima di inserire i valori in un tipo non-nullable (ad esempio Number o Boolean).

A ogni colonna nel database viene assegnato uno dei seguenti tipi di affinità:

  • TEXT (o String)

  • NUMERIC

  • INTEGER (o int)

  • REAL (o Number)

  • Boolean

  • Date

  • XML

  • XMLLIST

  • Object

  • NONE

TEXT (o String)

Una colonna con affinità TEXT o STRING archivia tutti i dati utilizzando le classi di archiviazione NULL, TEXT o BLOB. Se i dati numerici vengono inseriti in una colonna con affinità TEXT, prima di essere archiviati vengono convertiti in formato testo.

NUMERIC

Una colonna con affinità NUMERIC contiene valori che utilizzano le classi di archiviazione NULL, REAL o INTEGER. Quando in una colonna NUMERIC si inseriscono dati di testo, viene effettuato il tentativo di convertirli in un numero intero o reale prima di archiviarli. Se la conversione riesce, il valore viene archiviato utilizzando la classe di archiviazione INTEGER o REAL (ad esempio, un valore '10.05' viene convertito nella classe di archiviazione REAL prima di essere archiviato). Se la conversione non può essere eseguita, si verifica un errore. Non viene effettuato alcun tentativo di convertire un valore NULL. Un valore recuperato da una colonna NUMERIC viene restituito come un'istanza del tipo numerico più specifico applicabile al valore. In altre parole, se il valore è un numero intero positivo o 0, viene restituito come un'istanza uint. Se è un numero intero negativo, viene restituito come un'istanza int. Infine, se include un componente a virgola mobile (non è un numero intero), viene restituito come un'istanza Number.

INTEGER (o int)

Una colonna che utilizza l'affinità INTEGER ha lo stesso comportamento di una colonna con affinità NUMERIC, con un'eccezione. Se il valore da archiviare è un valore reale (ad esempio un'istanza Number) privo do componente a virgola mobile o se il valore è di tipo testo e può essere convertito in un valore reale senza componente a virgola mobile, viene convertito in un numero intero e archiviato utilizzando la classe di archiviazione INTEGER. Se tentate di archiviare un valore reale con un componente a virgola mobile, si verifica un errore.

REAL (o Number)

Una colonna con affinità REAL o NUMBER ha lo stesso comportamento di una colonna con affinità NUMERIC, ad eccezione del fatto che impone la rappresentazione a virgola mobile per i valore interi. Un valore in una colonna REAL viene sempre restituito dal database con un'istanza Number.

Boolean

Una colonna con affinità BOOLEAN archivia i valori come true o false. Una colonna BOOLEAN accetta un valore costituito da un'istanza Boolean ActionScript o JavaScript. Se il codice tenta di archiviare un valore String, tale valore con una lunghezza maggiore di zero viene considerato true, mentre se è vuoto viene considerato false. Se il codice tenta di archiviare dati numerici, qualsiasi valore diverso da zero viene archiviato come true, mentre 0 viene archiviato come false. Quando si recupera un valore Boolean utilizzando un'istruzione SELECT, viene restituito come un'istanza Boolean. I valori Non-NULL vengono archiviati utilizzando la classe di archiviazione INTEGER (0 per false e 1 per true) e convertiti in oggetti Boolean quando i dati vengono recuperati.

Date

Una colonna con affinità DATE archivia i valori di data e ora. Una colonna DATE è progettata per accettare i valori costituiti da istanze Date ActionScript o JavaScript. Se si tenta di archiviare un valore String in una colonna DATE, il runtime tenta ti convertirlo in una data giuliana. Se la conversione non riesce, si verifica un errore. Se il codice tenta di archiviare un valore Number, int o uint, non viene effettuato alcun tentativo di convalidare i dati, presupponendo che si tratti di un valore di data Julian valido. Un valore DATE recuperato utilizzando un'istruzione SELECT viene convertito automaticamente in un'istanza Date. I valori DATE vengono archiviati come valori di data Julian utilizzando la classe di archiviazione REAL, quindi le operazioni di ordinamento e confronto funzionano nel modo previsto.

XML o XMLList

Una colonna che utilizza l'affinità XML o XMLLIST archivia le strutture XML. Quando il codice tenta di archiviare i dati in una colonna XML utilizzando un parametro SQLStatement, il runtime tenta di convertire e convalidare il valore utilizzando la funzione ActionScript XML() o XMLList(). Se il valore non può essere convertito in un valore XML valido, si verifica un errore. Se nel tentativo di archiviare i dati viene utilizzato un valore di testo SQL letterale (ad esempio INSERT INTO (col1) VALUES ('Invalid XML (no closing tag)'), il valore non viene analizzato o convalidato —, presupponendo che sia formato correttamente. Se viene archiviato un valore non valido, al momento del recupero viene restituito come un oggetto XML vuoto. I dati XML e XMLLIST vengono archiviati utilizzando la classe di archiviazione TEXT o NULL.

Object

Una colonna con affinità OBJECT archivia oggetti complessi ActionScript o JavaScript, incluse le istanze della classe Object e le istanze delle sottoclassi di Object, quali le istanze di Array e anche di classi personalizzate. I dati della colonna OBJECT sono serializzati in formato AMF3 e archiviati utilizzando la classe di archiviazione BLOB. Quando si recupera un valore, viene deserializzato da AMF3 e restituito come un'istanza della classe utilizzata per l'archiviazione. Le classi ActionScript, in particolare gli oggetti di visualizzazione, non possono essere deserializzate come istanze del proprio tipo di dati originale. Prima di archiviare l'istanza di una classe personalizzata, dovete registrare un alias per la classe utilizzando il metodo flash.net.registerClassAlias() (oppure in Flex aggiungendo metadati [RemoteObject] alla dichiarazione della classe). Inoltre, prima di recuperare tali dati, dovete registrare lo stesso alias per la classe. I dati che non possono essere deserializzati correttamente, perché la classe non può essere intrinsecamente deserializzata o perché un alias di classe manca o non corrisponde, vengono restituiti come oggetto anonimo (un'istanza della classe Object) con proprietà e valori corrispondenti all'istanza originale archiviata.

NONE

Una colonna con affinità NONE non presenta alcuna preferenza per una classe di archiviazione rispetto a un'altra. Non viene effettuato alcun tentativo di convertire i dati prima dell'inserimento.

Determinazione dell'affinità

L'affinità del tipo di una colonna è determinata dal tipo dichiarato per la colonna nell'istruzione CREATE TABLE. Quando si determina il tipo, vengono applicate le seguenti regole (senza distinzione tra maiuscole e minuscole):

  • Se il tipo di dati della colonna contiene una qualsiasi stringa "CHAR", "CLOB", "STRI" o "TEXT", l'affinità della colonna è TEXT/STRING. Notate che il tipo VARCHAR contiene la stringa "CHAR", quindi viene assegnata l'affinità TEXT.

  • Se il tipo di dati della colonna contiene la stringa "BLOB" o non è specificato alcun tipo di dati, l'affinità della colonna è NONE.

  • Se il tipo di dati della colonna contiene la stringa "XMLL", l'affinità della colonna è XMLLIST.

  • Se il tipo di dati è la stringa "XML", l'affinità della colonna è XML.

  • Se il tipo di dati contiene la stringa "OBJE", l'affinità della colonna è OBJECT.

  • Se il tipo di dati contiene la stringa "BOOL", l'affinità della colonna è BOOLEAN.

  • Se il tipo di dati contiene la stringa "DATE", l'affinità della colonna è DATE.

  • Se il tipo di dati contiene la stringa "INT" (inclusa "UINT"), viene assegnata l'affinità INTEGER/int.

  • Se il tipo di dati di una colonna contiene una qualsiasi stringa "REAL", "NUMB", "FLOA" o "DOUB", l'affinità della colonna è REAL/NUMBER.

  • In caso contrario, l'affinità è NUMERIC.

  • Se si crea una tabella utilizzando un'istruzione CREATE TABLE t AS SELECT..., tutte le colonne non hanno alcun tipo di dati specificato, di conseguenza viene assegnata l'affinità NONE.

Tipi di dati e operatori di confronto

I seguenti operatori di confronto binari =, <, <=, >= e !sono supportati, unitamente a un'operazione per la verifica dell'appartenenza impostata, IN, e l'operatore di confronto ternario BETWEEN. Per ulteriori dettagli su questi operatori, vedete la sezione Operatori.

I risultati di un confronto dipendono dalle classi di archiviazione dei due valori confrontati. Quando si confrontano due valori, vengono applicate le seguenti regole:

  • Un valore con la classe di archiviazione NULL viene considerato inferiore a qualsiasi altro valore (incluso un altro valore con la classe di archiviazione NULL).

  • Un valore INTEGER o REAL è inferiore a qualsiasi valore TEXT o BLOB. Quando un valore INTEGER o REAL viene confrontato con un altro valore INTEGER o REAL, viene eseguito un confronto numerico.

  • Un valore TEXT è inferiore a un valore BLOB. Quando vengono confrontati due valori TEXT, viene eseguito un confronto binario.

  • Quando vengono confrontati due valori BLOB, il risultato è sempre determinato mediante un confronto binario.

L'operatore ternario BETWEEN viene sempre reinserito come l'espressione binaria equivalente. Ad esempio, a BETWEEN b AND c viene reinserito come a >= b AND a <= c, anche se ciò significa che vengono applicate affinità diverse a a in ognuno dei confronti richiesti per valutare l'espressione.

Le espressioni del tipo a IN (SELECT b ....) vengono gestite dalle tre regole enumerate precedentemente per i confronti binari, ovvero in modo analogo a a = b. Se ad esempio b è un valore di colonna e a un'espressione, l'affinità di b viene applicata a a prima di eseguire il confronto. L'espressione a IN (x, y, z) viene reinserita come a = +x OR a = +y OR a = +z. I valori a destra dell'operatore IN (i valori x, y e z in questo esempio) sono considerati espressioni, anche se sono valori di colonna. Se il valore a sinistra dell'operatore IN è una colonna, viene utilizzata l'affinità di tale colonna. Se il valore è un'espressione, non viene eseguito alcun confronto.

Anche l'uso di una clausola COLLATE può incidere sulla modalità di esecuzione dei confronti. Per ulteriori informazioni, vedete COLLATE.

Tipi di dati e operatori matematici

Per ognuno degli operatori matematici supportati, *, /, %, + e -, viene applicata un'affinità numerica a ogni operando prima di valutare l'espressione. Se un operando non può essere convertito correttamente nella classe di archiviazione NUMERIC, l'espressione restituisce NULL.

Quando si utilizza l'operatore di concatenazione ||, ogni operando viene convertito nella classe di archiviazione TEXT prima di valutare l'espressione. Se un operando non può essere convertito correttamente nella classe di archiviazione TEXT, il risultato dell'espressione è NULL. Questa incapacità di convertire il valore può verificarsi in due situazioni, se il valore dell'operando è NULL o se si tratta di un BLOB contenente una classe di archiviazione diversa da TEXT.

Tipi di dati e ordinamento

Quando i valori vengono ordinati da una clausola ORDER BY, vengono elencati per primi i valori con la classe di archiviazione NULL. Questi sono seguiti dai valori INTEGER e REAL in ordine numerico sparso, seguiti dai valori TEXT in ordine binario o in base alla sequenza di confronto specificata (BINARY o NOCASE). Infine sono elencati i valori BLOB in ordine binario. Prima dell'ordinamento non viene effettuata alcuna conversione della classe di archiviazione.

Tipi di dati e raggruppamento

Quando si raggruppano i valori con la clausola GROUP BY, i valori con classi di archiviazione diverse vengono considerati distinti. Fanno eccezione i valori INTEGER e REAL che sono considerati uguali, se sono numericamente equivalenti. Nessuna affinità viene applicata ad alcun valore come risultato di una clausola GROUP BY.

Tipi di dati e istruzioni SELECT composte

Gli operatori SELECT composti UNION, INTERSECT e EXCEPT eseguono confronti impliciti tra i valori. Prima dell'esecuzione di questi confronti, è possibile che venga applicata un'affinità a ogni valore. La stessa affinità, se presente, viene applicata a tutti i valori che possono essere restituiti in un'unica colonna del set di risultati dell'istruzione SELECT composta. L'affinità applicata è quella della colonna restituita dalla prima istruzione SELECT del componente con un valore di colonna (e non altri tipi di espressione) in quella posizione. Se per una determinata colonna SELECT composta nessuna delle istruzioni SELECT del componente restituisce un valore di colonna, non viene applicata alcuna affinità ai valori di tale colonna prima del confronto.