数据类型

SQLite 只有四种基元数据类型:INTEGER、REAL、TEXT 和 BLOB。 返回数据库 object 值的 API 将仅返回这四种类型之一。 Microsoft.Data.Sqlite 支持额外的 .NET 类型,但这些类型的值最终会被强制转换为四种基本类型之一。

。网 SQLite 注解
布尔型 整数 01
字节(Byte) 整数
Byte[] BLOB
字符型 发短信 UTF-8
DateOnly 发短信 yyyy-MM-dd
DateTime 发短信 yyyy-MM-dd HH:mm:ss。FFFFFFF
日期时间偏移 (DateTimeOffset) 发短信 yyyy-MM-dd HH:mm:ss。FFFFFFFzzz
十进制 发短信 0.0########################### 格式。 REAL 将有损。
加倍 真正
Guid 发短信 00000000-0000-0000-0000-000000000000
Int16 整数
Int32 整数
Int64 整数
SByte 整数
单身 真正
字符串 发短信 UTF-8
TimeOnly 发短信 HH:mm:ss.fffffff
TimeSpan 发短信 d.hh:mm:ss.fffffff
UInt16 整数
UInt32 整数
UInt64 整数 大值溢出

替代类型

可以从备用 SQLite 类型读取某些 .NET 类型。 还可以将参数配置为使用这些替代类型。 有关详细信息,请参阅 “参数”。

。网 SQLite 注解
字符型 整数 UTF-16
DateOnly 真正 儒略日值
DateTime 真正 儒略日值
日期时间偏移 (DateTimeOffset) 真正 儒略日值
Guid BLOB
TimeOnly 真正 以天为单位
TimeSpan 真正 以天为单位

例如,以下查询从结果集中的 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 不会对这些名称应用任何其他语义。

列类型名称确实会影响 类型相关性。 一个常见的 gotcha 是,使用 STRING 的列类型将尝试将值转换为 INTEGER 或 REAL,这可能会导致意外的结果。 建议仅使用四个基元 SQLite 类型名称:INTEGER、REAL、TEXT 和 BLOB。

SQLite 允许指定类型特征,例如长度、精度和刻度,但数据库引擎不会强制执行这些特征。 你的应用负责强制实施这些规定。

另请参阅