在 Delphi XE 中,我将字符串的 crc32 哈希存储在 SQlite 数据库中,在声明为 INTEGER 的列中。我的理解是 SQlite 不区分整数类型:int、int64、有符号和无符号,就数据库而言,它们都是相同的。但是,当我在 Delphi 中存储声明为 longword 的值时,WHERE 子句稍后无法匹配该值。
我的插入语句(此处删减)是:
INSERT INTO main VALUES (id, crc) (?, ?);
长字值绑定到第二个参数,一切顺利。但是当我这样做时
SELECT id FROM main WHERE crc = ?;
查询不返回任何结果。
在SQLiteSpy中查看数据库,长字值显示为负整数。如果我使用从该显示复制并粘贴的负值执行上述 SELECT,则查询将返回预期的记录。
似乎当我将长字值绑定到 INSERT 语句时,SQLIte 会在我将相同的长字值绑定到 SELECT 语句时执行其他操作。将值转换为整数(在 Delphi 代码中,而不是在 SQL 中)可以解决问题,但这不是必需的,而且很容易忘记在其他地方进行转换。有更好的解决方案吗?SQLite 的行为是否正确?