数据类型/存储类在SQLite中是否重要?

时间:2017-05-17 16:36:36

标签: sqlite sqldatatypes

我知道SQLite没有数据类型。但是我不太确定创建表格时是否重要?

我试图自动生成CREATE TABLE语句。在开始时,我认为我应该将C#数据类型映射到SQLite数据类型,直到我阅读storage class的描述。这个文件让我有点困惑,因此我认为最好是提出并纠正我的理解。

  1. 它说有5个存储类,分别是NULLINTEGERREALTEXTBLOB。但是,它还声明了5个亲缘关系,TEXTNUMERICINTEGERREALBLOB,它们不会完全映射到存储类。即,它没有NULL亲和力以及NUMERIC在存储类中映射的内容?

  2. C#中的
  3. Decimal是一个浮点,为什么它被映射到NUMERIC亲和力?那是因为REAL最多有8个字节而Decimal有16个吗? SQLite可以像在C#中一样存储Decimal吗?

  4. 为什么BooleanDecimal都映射到NUMERICBoolean似乎占用最小的存储空间(1个字节甚至1个位),但Decimal需要更多。如果NUMERIC是单字节类型,则无法存储Decimal,或者如果它是多字节,为什么Boolean不能映射到INTEGER }?它应该更有效率,不是吗?或者,我是否应该完全忘记SQLite中的数据类型字节?

  5. 虽然我脑子里有这些问题,但我试图将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语句。虽然StringInt32不是典型的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数据库中的任何其他潜在问题?

    提前致谢!

1 个答案:

答案 0 :(得分:3)

SQLite 具有数据类型,它只使用动态类型,即它不限制可插入列的类型。

亲和力不是存储类别;它们描述了一个列“想要”的类型。因此,没有NULL afinity。

NUMERIC亲和力映射到INTEGER或REAL,无论效率更高。

SQLite没有小数类型。

SQLite的存储类是类型,但the actual way how values are stored in the database是不同的。整数可以小于8个字节,布尔值可以小于0个字节。

将列类型写为Int32并不会使其与映射到INTEGER关联的任何其他类型有任何不同;它只对文档有用。