gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 15:09:13 30 4
gpt4 key购买 nike

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

我试图生成 CREATE TABLE自动声明。一开始,我以为我应该将 C# 数据类型映射到 SQLite 数据类型,直到我阅读了 storage class 的描述。 .这份文件让我有点困惑,因此我认为最好问问并纠正我的理解。

  • 它说有 5 个存储类,它们是 NULL , INTEGER , REAL , TEXTBLOB .但是,它也说明了 5 个亲缘关系,TEXT , NUMERIC , INTEGER , REALBLOB ,它不完全映射到存储类。即,它没有 NULL亲和力和什么会NUMERIC映射到存储类?
  • Decimal C#中是浮点数,为什么映射到NUMERIC亲和力?是因为REAL最大 8 个字节和 Decimal有 16 个? SQLite可以存储Decimal就像在 C# 中一样?
  • 为什么都是BooleanDecimal映射到 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 语句。虽然 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 数据库出现其他潜在问题?

    提前致谢!

    最佳答案

    SQLite 确实有数据类型,它只是使用动态类型,也就是说,它不限制可以插入到列中的类型。

    关联不是存储类;它们描述了列“想要”的类型。因此,没有 NULL 亲和性。

    NUMERIC 关联映射到 INTEGER 或 REAL,无论哪个更有效。

    SQLite 没有十进制类型。

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

    将列类型写为 Int32不会使其与映射到 INTEGER 亲和性的任何其他类型有任何不同;它仅对文档有用。

    关于sqlite - 数据类型/存储类在 SQLite 中是否重要?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44030448/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com