【发布时间】:2012-04-10 00:13:50
【问题描述】:
我使用 SQLite3 并有一个名为 blobs 的表,用于存储 content 和 *hash_value*。
这是架构:
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
我尝试了以下两个查询:
select * from blobs where hash_value = '34dc86f45b3dc92b352fd45f525192c0';select * from blobs where hash_value LIKE '34dc86f45b3dc92b352fd45f525192c0';
第一个不起作用,但第二个起作用。我不明白为什么= 运算符不起作用。
我试图将其分解为一个简单的示例,其中我的哈希只是 '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 有问题,但肯定有一些问题。
【问题讨论】:
-
我唯一能想到的是在字符串的开头或结尾有一个流氓不可打印字符。检查字符串长度,看看它们是否一致。
-
你也可以使用sqladmin来查询你的sqlite db..sqliteadmin.orbmu2k.de