Delphi XE では、文字列の crc32 ハッシュを SQlite データベースの INTEGER として宣言された列に保存しています。私の理解では、SQlite は整数型 (int、int64、signed、unsigned) を区別しません。データベースに関する限り、それらはすべて同じです。しかし、ロングワードとして宣言された値を Delphi に保存すると、後で WHERE 句がその値と一致しなくなります。
私の挿入ステートメント(ここでトリミング)は次のとおりです。
INSERT INTO main VALUES (id, crc) (?, ?);
ロングワード値は 2 番目のパラメーターにバインドされ、すべてがうまくいきます。しかし、私がするとき
SELECT id FROM main WHERE crc = ?;
クエリは結果を返しません。
SQLiteSpyでデータベースを表示すると、ロングワード値が負の整数として表示されます。その表示からコピーして貼り付けた負の値で上記の SELECT を実行すると、クエリは期待されるレコードを返します。
ロングワード値を INSERT ステートメントにバインドすると、同じロングワード値を SELECT ステートメントにバインドすると、SQLIte は別のことを行うように見えます。値を整数にキャストすると(SQL ではなく Delphi コードで)問題が解決しますが、その必要はなく、他の場所でのキャストを忘れがちです。より良い解決策はありますか?SQLite は正しく動作していますか?