在Delphi XE,我存儲CRC32驗證字符串的SQLite數據庫,聲明爲INTEGER列。我的理解是,SQlite不區分整數類型:int,int64,signed和unsigned,就數據庫而言,它們都是相同的。但是,當我在Delphi中存儲一個聲明爲longword的值時,WHERE子句稍後無法與該值匹配。sqlite的WHERE子句和德爾福XE長字值
我的INSERT語句(這裏下調)是:
INSERT INTO main VALUES (id, crc) (?, ?);
的長字值將被綁定到第二個參數,並且一切順利。但是當我做
SELECT id FROM main WHERE crc = ?;
查詢返回沒有結果。
查看在SQLiteSpy數據庫,該長字值顯示爲負整數。如果我使用從該顯示中複製並粘貼的負值執行上述SELECT,則查詢將返回預期的記錄。
這似乎是,當我長字值綁定到INSERT語句時,SQLite做別的東西然後當我結合相同的長字值的SELECT語句。將值轉換爲整數(在Delphi代碼中,而不是在SQL中)修復了這個問題,但它不應該是必須的,並且很容易忘記在其他地方投射。有更好的解決方案嗎? SQLite的行爲是否正確?
你爲什麼不使用符號的整數?如果這就是數據庫想要的,那麼也許你應該使用它。知道數據庫如何存儲數據,而不是猜測和使用試驗和錯誤對你來說是有益的。 – 2011-01-21 14:06:49
@David你可以將無符號的32位(即DWORD = cardinal)存儲到Int64中,而不需要任何技巧。這個問題不在SQlite中,而是以moodforaday的方式在綁定時強調DWORD值。 – 2011-01-21 15:02:40