SQLite 只有四种基元数据类型: INTEGER、 REAL、 TEXT和 BLOB。 返回数据库 object 值的 API 将仅返回这四种类型之一。 Microsoft.Data.Sqlite 支持额外的 .NET 类型,但这些类型的值最终会被强制转换为四种基本类型之一。
| .NET | SQLite | 注解 |
|---|---|---|
| Boolean | INTEGER |
0 或 1 |
| Byte | 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 | 大值溢出 |
替代类型
可以从备用 SQLite 类型读取某些 .NET 类型。 还可以将参数配置为使用这些替代类型。 有关详细信息,请参阅 “参数”。
| .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 允许指定类型特征,例如长度、精度和刻度,但数据库引擎不会强制执行这些特征。 你的应用负责强制实施这些规定。