Datentypen
SQLite verfügt nur über vier primitive Datentypen: INTEGER, REAL, TEXT und BLOB. APIs, die Datenbankwerte als object
zurückgeben, geben immer nur einen dieser vier Typen zurück. Weitere .NET-Typen werden zwar von Microsoft.Data.Sqlite unterstützt, aber die Werte werden letztendlich von diesen Typen in einen der vier primitiven Typen umgewandelt.
.NET | SQLite | Hinweise |
---|---|---|
Boolesch | INTEGER | 0 oder 1 |
Byte | INTEGER | |
Byte[] | BLOB | |
Char | TEXT | UTF-8 |
DateOnly | TEXT | JJJJ-MM-TT |
Datetime | TEXT | yyyy-MM-dd HH:mm:ss.FFFFFFF |
DateTimeOffset | TEXT | yyyy-MM-dd HH:mm:ss.FFFFFFFzzz |
Decimal | TEXT | Das verwendete Format ist 0.0########################### . REAL wäre verlustbehaftet. |
Double | real | |
GUID | TEXT | 00000000-0000-0000-0000-000000000000 |
Int16 | INTEGER | |
Int32 | INTEGER | |
Int64 | INTEGER | |
SByte | INTEGER | |
Single | real | |
Zeichenfolge | TEXT | UTF-8 |
TimeOnly | TEXT | HH:mm:ss.fffffff |
TimeSpan | TEXT | d.hh:mm:ss.fffffff |
UInt16 | INTEGER | |
UInt32 | INTEGER | |
UInt64 | INTEGER | Überlauf bei großen Werten |
Alternative Typen
Einige .NET-Typen können auch als andere SQLite-Typen gelesen werden. Parameter können auch so konfiguriert werden, dass diese alternativen Typen verwendet werden. Weitere Informationen finden Sie unter Parameter.
.NET | SQLite | Hinweise |
---|---|---|
Char | INTEGER | UTF-16 |
DateOnly | real | Wert für julianischen Tag |
DateTime | real | Wert für julianischen Tag |
DateTimeOffset | real | Wert für julianischen Tag |
GUID | BLOB | |
TimeOnly | real | In Tagen |
TimeSpan | real | In Tagen |
Die folgende Abfrage liest beispielsweise einen TimeSpan-Wert aus einer REAL-Spalte im Resultset.
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}.");
}
}
Spaltentypen
SQLite verwendet ein dynamisches Typsystem, bei dem der Typ eines Werts dem Wert selbst und nicht der Spalte zugeordnet ist, in der er gespeichert ist. Sie können beliebige Spaltentypnamen verwenden. Microsoft.Data.Sqlite wendet keine zusätzliche Semantik auf diese Namen an.
Der Spaltentypname wirkt sich allerdings auf die Typaffinität aus. Ein häufig auftretendes Problem besteht darin, dass bei Verwendung des Spaltentyps STRING versucht wird, die Werte in die Datentypen INTEGER oder REAL umzuwandeln, was zu unerwarteten Ergebnissen führen kann. Es wird empfohlen, nur die vier primitiven SQLite-Typnamen zu verwenden: INTEGER, REAL, TEXT und BLOB.
SQLite ermöglicht Ihnen das Angeben von Facets für Typen (z. B. Länge, Genauigkeit und Größe), die jedoch nicht von der Datenbank-Engine erzwungen werden. Ihre App ist dafür verantwortlich, diese zu erzwingen.