1

私は 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 で問題を抱えている理由はわかりませんが、これには何か怪しいものがあることは間違いありません。

4

2 に答える 2

2

2つの違いは、エンコーディングです。

Digest::MD5.hexdigest("foobar").encoding #=>  #<Encoding:ASCII-8BIT> 
Digest::MD5.base64digest("foobar").encoding #=> #<Encoding:US-ASCII> 

hexdigestが8ビットエンコーディングを持っている特別な理由はないと思います(これは事実上「これは生データです」を意味しますが、それはルビーがしているようです。ルビーsqlite3ドライバーがascii-8ビットエンコーディングで何かを見ると、それはバインドしますクエリの値をテキストではなくblobとして指定します。これは、sqlite3が比較を行う方法に影響します(正確な方法はわかりませんが)。

この質問も参照してください

于 2012-04-10T12:12:29.663 に答える
0

解決策は次のとおりです。

Digest :: MD5.hexdigest( "foobar")を使用する代わりに、Digest :: MD5.base64digest( "foobar")を使用します。sqlite3がhexdigestに問題がある理由はわかりませんが、これには間違いなく怪しいものがあります。

于 2012-04-10T09:56:55.720 に答える