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