在SQLITE3 Docu中,您可以找到:
“ SQLite使用更通用的动态类型系统。在SQLite中,值的数据类型与值本身(而不是其容器)相关联。SQLite的动态类型系统与以下更常见的静态类型系统向后兼容从其他意义上说,其他数据库引擎在静态类型数据库上运行的SQL语句在SQLite中应以相同的方式工作。但是,SQLite中的动态类型允许它执行传统的刚性类型数据库中无法做到的事情。”
我有一列具有不同值的列,其中一些是整数,一些浮点数和一些文本。我使用BLOB als存储类,并且工作正常。但是我对此解决方案有点怀疑。这是在同一列中存储数字和文本的正确方法吗?
答案 0 :(得分:2)
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的“另一个”和存储类REAL的10.1111111111111。
通常,您不必太担心存储类,如从我的示例中看到的那样,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关联性;或者如果要基于数据表示的数值进行比较,则例如真实的。