Delphi XEでは、文字列のcrc32ハッシュをSQliteデータベースのINTEGERとして宣言された列に格納します。私の理解では、SQliteはint型、int64型、signed型、unsigned型の区別はしませんが、データベースに関してはすべて同じです。しかし、Delphiでロングワードとして宣言された値を保存すると、WHERE句はその値と後で一致しません。 (ここではトリムダウン)Sqlite WHERE句とDelphi XEロングワード値
私のinsert文は次のとおりです。
INSERT INTO main VALUES (id, crc) (?, ?);
ロングワード値は、二番目のパラメータにバインドされますし、すべてがうまくいきます。しかし、私が行うとき
SELECT id FROM main WHERE crc = ?;
クエリは結果を返しません。
SQLiteSpyでデータベースを表示すると、ロングワード値は負の整数として表示されます。そのディスプレイからコピー&ペーストされた負の値で上記のSELECTを実行すると、クエリは予想されるレコードを返します。
ロングワード値をINSERTステートメントにバインドすると、同じロングワード値をSELECTステートメントにバインドするときにSQLIteが何か他のことを行うように見えます。値を整数にキャストすると(SQLではなく、Delphiコードで)問題は解決されますが、必ずしも必要ではないので、他の場所でキャストすることを忘れてしまいます。より良い解決策はありますか? SQLiteは正しく動作していますか?
なぜ符号付き整数を使用しないのですか?それがDBが望んでいるものなら、おそらくあなたはそれでロールすべきです。試行錯誤を推測して使用するのではなく、DBがデータをどのように格納するかを知ることは有益でしょう。 –
@David何もせずにInt64に符号なし32ビット(つまりDWORD =基数)を格納することができます。この問題はSQliteではなく、moodforadayがバインド時にDWORD値を型キャストする方法にあります。 –