Tipo di dati
SQLite ha solo quattro tipi di dati primitivi: INTEGER, REAL, TEXT e BLOB. Le API che restituiscono valori di database come object
restituiranno solo uno di questi quattro tipi. Microsoft.Data.Sqlite supporta anche altri tipi .NET, ma in ultima analisi i valori sono impostati forzatamente tra questi tipi e uno dei quattro tipi primitivi.
.NET | SQLite | Osservazioni: |
---|---|---|
Booleano | INTEGER | 0 oppure 1 |
Byte | INTEGER | |
Byte[] | BLOB | |
Char | TEXT | UTF-8 |
DateOnly | TEXT | yyyy-MM-dd |
Data/Ora | TEXT | yyyy-MM-dd HH:mm:ss.FFFFFFF |
DateTimeOffset | TEXT | yyyy-MM-dd HH:mm:ss.FFFFFFFzzz |
Decimale | TEXT | Formato 0.0########################### . REAL genererebbe una perdita di dati. |
Double | REAL | |
GUID | TEXT | 00000000-0000-0000-0000-000000000000 |
Int16 | INTEGER | |
Int32 | INTEGER | |
Int64 | INTEGER | |
SByte | INTEGER | |
Singola | REAL | |
String | TEXT | UTF-8 |
TimeOnly | TEXT | HH:mm:ss.fffffff |
TimeSpan | TEXT | d.hh:mm:ss.fffffff |
UInt16 | INTEGER | |
UInt32 | INTEGER | |
UInt64 | INTEGER | Overflow di valori di grandi dimensioni |
Tipi alternativi
Alcuni tipi .NET possono essere letti da tipi SQLite alternativi. È anche possibile configurare i parametri per l'uso di questi tipi alternativi. Per altre informazioni, vedere Parametri.
.NET | SQLite | Osservazioni: |
---|---|---|
Char | INTEGER | UTF-16 |
DateOnly | REAL | Valore del giorno giuliano |
Data/Ora | REAL | Valore del giorno giuliano |
DateTimeOffset | REAL | Valore del giorno giuliano |
GUID | BLOB | |
TimeOnly | REAL | In giorni |
TimeSpan | REAL | In giorni |
Ad esempio, la query seguente legge un valore TimeSpan da una colonna REAL nel set di risultati.
command.CommandText =
@"
SELECT name, julianday(finished) - julianday(started) AS length
FROM task
WHERE finished IS NOT NULL
";
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
var name = reader.GetString(0);
var length = reader.GetTimeSpan(1);
Console.WriteLine($"'{name}' took {length}.");
}
}
Tipi di colonna
SQLite usa un sistema di tipi dinamici in cui il tipo di un valore è associato al valore stesso e non alla colonna in cui è archiviato. È possibile usare qualsiasi nome di tipo di colonna desiderato. Microsoft.Data.Sqlite non applicherà alcuna semantica aggiuntiva a questi nomi.
Il nome del tipo di colonna ha un impatto sull'affinità del tipo. Un problema comune è che usando un tipo di colonna STRING verrà tentata la conversione dei valori in INTEGER o REAL, causando risultati imprevisti. È consigliabile usare solo i quattro nomi di tipi SQLite primitivi: INTEGER, REAL, TEXT e BLOB.
SQLite consente di specificare facet dei tipi come lunghezza, precisione e scala, ma questi non vengono applicati dal motore di database. La responsabilità di applicarli è dell'applicazione.