我在Python中有一个sqlite表:
CREATE TABLE lookup ( id string PRIMARY KEY );
在此表中,我插入了很多行,然后创建了一个索引:
CREATE INDEX intindex ON lookup(id);
我现在要测试我的字符串是否在表中。我尝试了以下方法:
checkval = cursor.execute("""SELECT EXISTS (SELECT 1
FROM lookup
WHERE id=?
LIMIT 1)""", (str(mystring), )).fetchone()[0]
但是问题是,这似乎仅检查字符串的前16个左右字符是否相同。例如,我知道我的表包含:
'95592037576585500895905906368332492139177507248814568869956683982249018785792'
但是,如果我检查不存在的值:
'95592037576585501898360696547541541617886282712262516411315613154848368326494'
然后我也得到了TRUE
。
检查:
'95592137576585500895905906368332492139177507248814568869956683982249018785792'
确实导致FALSE
。
为什么不比较完整字符串?
在SQLite中没有数据类型STRING
。
如果将其用作列的数据类型,则如“确定列的亲和力”中所述,该列将具有NUMERIC
亲和力。
因此,像这样的值:
'95592037576585500895905906368332492139177507248814568869956683982249018785792'
和
'95592037576585501898360696547541541617886282712262516411315613154848368326494'
将被视为浮点数,并且由于精度限制,其值将为:
9.5592037576586E+76
所以实际上他们是平等的。
参见演示。
对于字符串TEXT
,SQLite中只有数据类型,您应该将列的定义更改为该类型。
同样,您不应该LIMIT
在代码中使用。
EXISTS
不会在查询中执行完全扫描,因为它会在找到符合条件的第一行后立即返回。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句