В Delphi XE я храню хэш crc32 строки в базе данных SQlite в столбце, объявленном как INTEGER.Насколько я понимаю, SQlite не различает целочисленные типы: int, int64, подписанные и неподписанные, все они одинаковы в отношении базы данных.Однако, когда я сохраняю значение, объявленное как longword в Delphi, предложение WHERE не совпадает с этим значением позже.
Мой оператор вставки (обрезанный здесь):
INSERT INTO main VALUES (id, crc) (?, ?);
Значение длинного слова связывается со вторым параметром, и все идет хорошо.Но когда я выполняю
SELECT id FROM main WHERE crc = ?;
, запрос не возвращает результатов.
Просмотр базы данных в SQLiteSpy , значения длинных слов отображаются как отрицательные целые числа.Если я выполню вышеупомянутый SELECT с отрицательным значением, скопированным и вставленным из этого дисплея, запрос вернет ожидаемую запись.
Может показаться, что когда я связываю значение длинного слова с оператором INSERT, SQLIte что-то делаетиначе тогда, когда я привяжу то же значение длинного слова к оператору SELECT.Преобразование значения в целое число (в коде Delphi, а не в SQL) устраняет проблему, но в этом нет необходимости, и будет легко забыть преобразовать ее в другие места.Есть ли лучшее решение?SQLite ведет себя правильно?