我知道SQLite没有数据类型。但是我不太确定创建表格时是否重要?
我试图自动生成CREATE TABLE
语句。在开始时,我认为我应该将C#数据类型映射到SQLite数据类型,直到我阅读storage class的描述。这个文件让我有点困惑,因此我认为最好是提出并纠正我的理解。
它说有5个存储类,分别是NULL
,INTEGER
,REAL
,TEXT
和BLOB
。但是,它还声明了5个亲缘关系,TEXT
,NUMERIC
,INTEGER
,REAL
和BLOB
,它们不会完全映射到存储类。即,它没有NULL
亲和力以及NUMERIC
在存储类中映射的内容?
Decimal
是一个浮点,为什么它被映射到NUMERIC
亲和力?那是因为REAL
最多有8个字节而Decimal
有16个吗? SQLite可以像在C#中一样存储Decimal
吗?
为什么Boolean
和Decimal
都映射到NUMERIC
? Boolean
似乎占用最小的存储空间(1个字节甚至1个位),但Decimal
需要更多。如果NUMERIC
是单字节类型,则无法存储Decimal
,或者如果它是多字节,为什么Boolean
不能映射到INTEGER
}?它应该更有效率,不是吗?或者,我是否应该完全忘记SQLite中的数据类型字节?
虽然我脑子里有这些问题,但我试图将struct
映射到表格中。一些示例代码可以看作如下(排除类/函数结构):
public sealed class ScreenInfo {
public int ScreenId;
public string Name;
public int BoundX;
public int BoundY;
public int BoundW;
public int BoundH;
public int WorkingAreaX;
public int WorkingAreaY;
public int WorkingAreaW;
public int WorkingAreaH;
public int BitsPerPixel;
public bool IsPrimary;
public Rectangle Bounds {
get { return new Rectangle(BoundX, BoundY, BoundW, BoundH); }
set { BoundX = value.X; BoundY = value.Y; BoundW = value.Width; BoundH = value.Height; }
}
public Rectangle WorkingArea {
get { return new Rectangle(WorkingAreaX, WorkingAreaY, WorkingAreaW, WorkingAreaH); }
set { WorkingAreaX = value.X; WorkingAreaY = value.Y; WorkingAreaW = value.Width; WorkingAreaH = value.Height; }
}
}
StringBuilder sb = new StringBuilder();
sb.Append("CREATE TABLE `Screens` (`id` INTEGER PRIMARY KEY AUTOINCREMENT");
var fields = typeof(ScreenInfo).GetFields();
foreach (var f in fields) {
sb.Append($", `{f.Name}` {Type.GetTypeCode(f.FieldType).ToString()}");
}
sb.Append(");");
上面的代码生成以下SQL语句。虽然String
和Int32
不是典型的SQL数据类型,但它似乎工作正常。
"CREATE TABLE `Screens` (`id` INTEGER PRIMARY KEY AUTOINCREMENT, `ScreenId` Int32, `Name` String, `BoundX` Int32, `BoundY` Int32, `BoundW` Int32, `BoundH` Int32, `WorkingAreaX` Int32, `WorkingAreaY` Int32, `WorkingAreaW` Int32, `WorkingAreaH` Int32, `BitsPerPixel` Int32, `IsPrimary` Boolean);"
如果结构不包含名为id
的字段(否则它将与主键冲突),它是否会导致SQLite数据库中的任何其他潜在问题?
提前致谢!
答案 0 :(得分:3)
SQLite 具有数据类型,它只使用动态类型,即它不限制可插入列的类型。
亲和力不是存储类别;它们描述了一个列“想要”的类型。因此,没有NULL afinity。
NUMERIC亲和力映射到INTEGER或REAL,无论效率更高。
SQLite没有小数类型。
SQLite的存储类是类型,但the actual way how values are stored in the database是不同的。整数可以小于8个字节,布尔值可以小于0个字节。
将列类型写为Int32
并不会使其与映射到INTEGER关联的任何其他类型有任何不同;它只对文档有用。