Delphi XE에서 SQlite 데이터베이스에 INTEGER로 선언 된 열의 crc32 해시를 저장하려고합니다. 제 생각에 SQlite는 int, int64, signed 및 unsigned와 같은 정수형을 구별하지 않습니다. 데이터베이스와 관련해서는 모두 동일합니다. 그러나 Delphi에서 longword로 선언 된 값을 저장할 때 WHERE 절은 나중에 해당 값과 일치하지 않습니다. (여기 아래 손질)Sqlite WHERE 절과 Delphi XE Longword 값
내 삽입 문은 다음과 같습니다
INSERT INTO main VALUES (id, crc) (?, ?);
긴 단어 값은 두 번째 매개 변수에 바인딩됩니다 모두 잘 간다. 그러나 내가 할 때
SELECT id FROM main WHERE crc = ?;
쿼리는 결과를 반환하지 않습니다.
데이터베이스를 SQLiteSpy으로 보면 Longword 값이 음수로 표시됩니다. 해당 디스플레이에서 복사하여 붙여 넣은 음수 값으로 위의 SELECT를 실행하면 쿼리에서 예상 레코드를 반환합니다.
필자가 INSERT 문에 Longword 값을 바인딩 할 때 SQLIte는 SELECT 문과 동일한 Longword 값을 바인딩 할 때 다른 작업을 수행하는 것처럼 보일 것입니다. 값을 정수로 캐스팅하는 것은 (SQL이 아닌 델파이 코드에서) 문제를 수정하지만 반드시 필요한 것은 아니며 다른 곳에서 캐스팅하는 것을 잊기 쉽습니다. 더 나은 해결책이 있습니까? SQLite가 올바르게 동작합니까?
부호가없는 정수를 사용하는 이유는 무엇입니까? 그게 DB가 원하는 것이라면 아마 그것으로 굴러 가야 할 것입니다. 시행 착오를 추측하고 사용하는 대신 DB가 데이터를 저장하는 방법을 아는 것이 유용 할 것입니다. –
@David 트릭없이 부호없는 32 비트 (즉, DWORD = 추기경)를 Int64에 저장할 수 있습니다. 이 문제는 SQlite에는 없지만 moodforaday가 바인딩시 DWORD 값을 typecasting하는 방식에 있습니다. –