为何SQLite中布尔字段两种条件查询结果不一致?
问题原因分析
核心原因是SQLite的类型转换规则,结合你字段的实际存储特性导致的:
- 你的
AlwaysFalseBooleanField字段是TEXT类型,实际存储的是字符串'False'(首字母大写的文本值)。 - SQLite里的
True和False是内置宏,会被直接替换为整数1和0,而非字符串。 - 当TEXT类型的值与NUMERIC类型的值比较时,SQLite会遵循类型转换优先级:将NUMERIC类型的值转换为TEXT类型后再做字符串比较,而非把TEXT值转成数字。
两个查询的具体分析
第一个查询:
SELECT * FROM MyTable WHERE AlwaysFalseBooleanField = False ORDER BY Index DESC;False被替换为整数0,SQLite会把0转为字符串'0',再和字段存储的'False'做比较——两者字符串内容完全不同,因此没有匹配行,返回零结果。第二个查询:
SELECT * FROM MyTable WHERE AlwaysFalseBooleanField <> True ORDER BY Index DESC;True被替换为整数1,SQLite将1转为字符串'1',字段存储的'False'和'1'不相等,所有存储'False'的行都满足条件,因此返回预期结果。
修复第一个查询的方法
如果要让第一个查询正常匹配,需要把False当作字符串来比较:
SELECT * FROM MyTable WHERE AlwaysFalseBooleanField = 'False' ORDER BY Index DESC;
内容的提问来源于stack exchange,提问作者nopik
相关产品推荐
相关产品推荐

