Datatyper
SQLite har bara fyra primitiva datatyper: INTEGER, REAL, TEXT och BLOB. API:er som returnerar databasvärden som en object
returnerar bara någon av dessa fyra typer. Ytterligare .NET-typer stöds av Microsoft.Data.Sqlite, men värden tvingas i slutändan mellan dessa typer och en av de fyra primitiva typerna.
.NET | SQLite | Kommentarer |
---|---|---|
Booleskt | INTEGER | 0 eller 1 |
Byte | INTEGER | |
Byte[] | BLOB | |
Char | TEXT | UTF-8 |
DateOnly | TEXT | åååå-MM-dd |
Datum/tid | TEXT | åååå-MM-dd HH:mm:ss. FFFFFFF |
DateTimeOffset | TEXT | åååå-MM-dd HH:mm:ss. FFFFFFFzzz |
Decimal | TEXT | 0.0########################### Format. REAL skulle vara förlustigt. |
Dubbel | REAL | |
GUID | TEXT | 00000000-0000-0000-0000-000000000000 |
Int16 | INTEGER | |
Int32 | INTEGER | |
Int64 | INTEGER | |
SByte | INTEGER | |
Enstaka | REAL | |
String | TEXT | UTF-8 |
TimeOnly | TEXT | HH:mm:ss.fffffff |
TimeSpan | TEXT | d.hh:mm:ss.fffffffff |
UInt16 | INTEGER | |
UInt32 | INTEGER | |
UInt64 | INTEGER | Stora värden flödar över |
Alternativa typer
Vissa .NET-typer kan läsas från alternativa SQLite-typer. Parametrar kan också konfigureras för att använda dessa alternativa typer. Mer information finns i Parametrar.
.NET | SQLite | Kommentarer |
---|---|---|
Char | INTEGER | UTF-16 |
DateOnly | REAL | Julians dagvärde |
Datum/tid | REAL | Julians dagvärde |
DateTimeOffset | REAL | Julians dagvärde |
GUID | BLOB | |
TimeOnly | REAL | I dagar |
TimeSpan | REAL | I dagar |
Följande fråga läser till exempel ett TimeSpan-värde från en REAL-kolumn i resultatuppsättningen.
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}.");
}
}
Kolumntyper
SQLite använder ett dynamiskt typsystem där typen av ett värde är associerad med själva värdet och inte kolumnen där det lagras. Du kan använda det kolumntypsnamn du vill. Microsoft.Data.Sqlite tillämpar inga ytterligare semantik på dessa namn.
Namnet på kolumntypen påverkar typtillhörigheten. En vanlig gotcha är att om du använder en kolumntyp av STRING försöker du konvertera värden till INTEGER eller REAL, vilket kan leda till oväntade resultat. Vi rekommenderar att du bara använder de fyra primitiva SQLite-typnamnen: INTEGER, REAL, TEXT och BLOB.
Med SQLite kan du ange typfasetter som längd, precision och skala, men de tillämpas inte av databasmotorn. Din app ansvarar för att framtvinga dessa.