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 亲和性,或者如果您想根据数据所代表的数值进行比较,那么例如真实的。