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