データ型
SQLite には、INTEGER、REAL、TEXT、BLOB の 4 つのプリミティブ データ型のみが存在します。 データベースの値が object
として返される API では、この 4 つの型のいずれかのみが返されます。 Microsoft.Data.Sqlite では他の .NET 型がサポートされていますが、最終的には、それらの型と 4 つのいずれかのプリミティブ型との間で値が強制的に変換されます。
.NET | SQLite | Remarks |
---|---|---|
ブール型 | 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 (10 進数型) | 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 | Remarks |
---|---|---|
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 への変換が試みられ、予期しない結果を招く可能性があります。 INTEGER、REAL、TEXT、BLOB の 4 つのプリミティブ SQLite 型名だけを使用することをお勧めします。
SQLite では、長さ、有効桁数、小数点以下桁数などの型のファセットを指定できますが、これらはデータベース エンジンによって適用されません。 これらは使用しているアプリによって適用されます。
関連項目
.NET