私は SQLite3 を使用しており、コンテンツと *hash_value*を格納する blobs というテーブルがあります。
スキーマは次のとおりです。
CREATE TABLE "blobs" (
"id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
"content" blob,
"hash_value" text,
"created_at" datetime NOT NULL,
"updated_at" datetime NOT NULL
);
今、私はいくつかのデータを挿入しました。次のようになります。
1|--- foo
...
|34dc86f45b3dc92b352fd45f525192c0|2012-04-09 17:02:54.219504|2012-04-09 17:02:54.219504
そして、次の2つのクエリを試しました:
select * from blobs where hash_value = '34dc86f45b3dc92b352fd45f525192c0';
select * from blobs where hash_value LIKE '34dc86f45b3dc92b352fd45f525192c0';
1 つ目は機能しませんが、2 つ目は機能します。=
オペレーターが機能しない理由がわかりません。
'abc'
これを、ハッシュがちょうど機能し、= が機能する単純な例に分解しようとしました。つまり、この文字列はほとんど長すぎません。
編集
わかりました、実際にこれに絞り込みました:
- Rubyを使用して、このようなハッシュを生成しています
Digest::MD5.hexdigest("foobar")
- これにより、次のような文字列が生成されます。
'3858f62230ac3c915f300c664312c63f'
- 私のテストは次のようになります。
b = Blob.new(...);b.save!;Blob.find_by_hash(b.hash)
- そしてfind_hashは
Blob.find(:all, :conditions => ["hash_value = ?", hash_value])
- ハッシュを
'3858f62230ac3c915f300c664312c63f'
(ハードコードされた文字列)に手動で設定すると機能します。 しかし、この文字列が生成されると、次のエラーが発生します。
Failure/Error: Blob.find_by_hash(b.hash_value)[0].load.should == txt ArgumentError: wrong number of arguments (0 for 1)
また、上記のように SQLite3 にクエリを実行できません。
解決
解決策は次のとおりです。
- Digest::MD5.hexdigest("foobar") を使用する代わりに、Digest::MD5.base64digest("foobar") を使用します
sqlite3 が hexdigest で問題を抱えている理由はわかりませんが、これには何か怪しいものがあることは間違いありません。