資料類型
SQLite 只有四種基本資料類型:INTEGER、REAL、TEXT 和 BLOB。 object
傳回資料庫值的 API 只會傳回這四種類型的其中一種。 Microsoft.Data.Sqlite 支援其他 .NET 類型,但最終會在這些類型與四個基本類型之一之間強制轉型值。
.NET | SQLite | 備註 |
---|---|---|
布林值 | INTEGER | 0 或 1 |
位元組 | INTEGER | |
Byte[] | BLOB | |
Char | TEXT | UTF-8 |
DateOnly | TEXT | yyyy-MM-dd |
Datetime | TEXT | yyyy-MM-dd HH:mm:ss.FFFFFFF |
DateTimeOffset | TEXT | yyyy-MM-dd HH:mm:ss.FFFFFFFzzz |
Decimal | TEXT | 0.0########################### 格式。 REAL 會遺失。 |
Double | REAL | |
GUID | TEXT | 00000000-0000-0000-0000-000000000000 |
Int16 | INTEGER | |
Int32 | INTEGER | |
Int64 | INTEGER | |
SByte | INTEGER | |
Single | REAL | |
String | TEXT | UTF-8 |
TimeOnly | TEXT | HH:mm:ss.fffffff |
TimeSpan | TEXT | d.hh:mm:ss.fffffff |
UInt16 | INTEGER | |
UInt32 | INTEGER | |
UInt64 | INTEGER | 大型值溢位 |
替代型別
有些 .NET 類型可從替代 SQLite 類型讀取。 參數也可以設定為使用這些替代類型。 如需詳細資訊,請參閱參數。
.NET | SQLite | 備註 |
---|---|---|
Char | INTEGER | UTF-16 |
DateOnly | REAL | 凱撒曆日期值 |
Datetime | REAL | 凱撒曆日期值 |
DateTimeOffset | REAL | 凱撒曆日期值 |
GUID | BLOB | |
TimeOnly | REAL | 以天為單位 |
TimeSpan | REAL | 於幾天內 |
例如,下列查詢會從結果集中的 REAL 資料行讀取 TimeSpan 值。
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}.");
}
}
資料行類型
SQLite 會使用動態類型系統,其中值的類型與值本身相關聯,而不是儲存值的資料行。 您可以任意使用您想要的資料行類型名稱。 Microsoft.Data.Sqlite 不會將任何其他語意套用至這些名稱。
資料行類型名稱會對類型親和性造成影響。 其中一個常見的陷阱是,使用 STRING 的資料行類型會嘗試將值轉換成 INTEGER 或 REAL,這可能會導致非預期的結果。 我們建議只使用四個基本 SQLite 類型名稱:INTEGER、REAL、TEXT 和 BLOB。
SQLite 可讓您指定類型 Facet,例如長度、有效位數和小數位數,但資料庫引擎不會強制執行。 您的應用程式會負責強制執行這些動作。