【问题标题】:SQLITE3 store text and numbers in the same columnSQLITE3 将文本和数字存储在同一列中
【发布时间】:2018-11-02 11:28:18
【问题描述】:

在 SQLITE3 文档中你可以找到:

"SQLite 使用更通用的动态类型系统。在 SQLite 中,值的数据类型与值本身相关联,而不是与其容器相关联。SQLite 的动态类型系统向后兼容更常见的静态类型系统其他数据库引擎在某种意义上说,在静态类型数据库上工作的 SQL 语句应该在 SQLite 中以相同的方式工作。但是,SQLite 中的动态类型允许它完成传统刚性类型数据库中不可能完成的事情。”

我有一列具有不同的值,一些是整数,一些是浮点数和一些文本。我使用 BLOB als 存储类,它工作正常。但我对这个解决方案有点怀疑。这是将数字和文本存储在同一列中的正确方法吗?

【问题讨论】:

    标签: sqlite


    【解决方案1】:

    TLDR;你没有做错,但我也认为你没有做你认为你正在做的事情。

    我认为您使用的不是 BLOB 存储类,而是 BLOB 类型关联。 In SQLite there are 2 concepts of datatype。存储类和类型关联。

    存储类是给定值存储在内存中的方式,它描述了位模式如何表示值。例如。虽然在数值上相等,但整数 1 和浮点 1.0 由非常不同的位模式表示(至少在内存中,但奇怪的是“作为内部优化,没有小数部分并存储在具有 REAL 亲和力的列中的小浮点值是以整数形式写入磁盘”)。 有 5 个存储类,NULL、INTEGER、REAL、TEXT 和 BLOB。

    另一方面,类型亲和性不是一个值,而是一个列级概念。类型亲和性是给定列的特征。还有 5 种类型的亲和性,NUMBER、INTEGER、REAL、TEXT 和 BLOB。

    您可能会注意到的第一件事是,存储类和关联性之间没有 1-1 映射。那是因为它们确实几乎完全不相关。考虑以下

    sqlite> CREATE TABLE Test(A TEXT, B BLOB, C REAL);
    sqlite> INSERT INTO Test VALUES ('text', 'also a text', 'another one');
    sqlite> INSERT INTO Test VALUES (10, 10.1, 10.11111111111111111111111);
    sqlite> SELECT A, TYPEOF(A), B, TYPEOF(B), C, TYPEOF(C) FROM Test;
    text|text|also a text|text|another one|text
    10|text|10.1|real|10.1111111111111|real
    

    如您所见,我使用 TEXT、BLOB 和 REAL 类型定义了列。 Those are the affinities。但是我能够将不同类型的值插入到它们中,而不管它们的亲和力如何。例如。 C 列现在存储“另一个”,存储类为 TEXT,存储类为 10.1111111111111,存储类为 REAL。

    通常你不应该太关心存储类,正如你从我的例子中看到的那样,SQLite 只是自动并正确地从我插入的数据中推断出它们。 类型亲和力更重要。这就是描述如何比较、排序数据以及如何确定其唯一性的内容。例如

    sqlite> CREATE Table T(A TEXT);
    sqlite> INSERT INTO T VALUES ('1'), (2), (0.0);
    sqlite> SELECT * FROM T ORDER BY A ASC;
    0.0
    1
    2
    sqlite> CREATE TABLE R(A REAL);
    sqlite> INSERT INTO R VALUES ('1'), (2), (0.0);
    sqlite> SELECT * FROM R ORDER BY A ASC;
    0.0
    1.0
    2.0
    sqlite> CREATE TABLE B(A BLOB);
    sqlite> INSERT INTO B VALUES ('1'), (2), (0.0);
    sqlite> SELECT * FROM B ORDER BY A ASC;
    0.0
    2
    1
    

    因此,出于实际目的,它与您对数据类型的直观想法更密切相关。想想您的数据意味着什么,并相应地选择相关性。如果您将值存储在 BLOB 关联列中,则会对它们进行按位比较。如果这是你想要的,那就去吧。但是,如果您想要字典比较,则需要 TEXT 亲和性,或者如果您想根据数据所代表的数值进行比较,那么例如真实的。

    【讨论】:

      猜你喜欢
      • 2011-03-01
      • 2011-06-22
      • 2012-07-16
      • 1970-01-01
      • 1970-01-01
      • 2022-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多