数据类型

SQLite 仅有四个基元数据类型:INTEGER、REAL、TEXT 和 BLOB。 将数据库值返回为 object 的 API 只返回这四种类型之一。 Microsoft.Data.Sqlite 支持其他 .NET 类型,但最终强制这些值在这些类型和四种基元类型中的一种类型之间进行转换。

.NET SQLite 备注
Boolean INTEGER 01
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
十进制 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 可让用户指定类型方面,例如长度、精度和小数位数,但数据库引擎不强制执行这些方面。 你的应用负责强制执行这些方面。

请参阅