【问题标题】:Why does LIKE in SQLite3 work in this statement but = does not?为什么 SQLite3 中的 LIKE 在此语句中有效但 = 无效?
【发布时间】: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

标签: ruby sqlite md5


【解决方案1】:

两者的区别在于编码:

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

我不认为 hexdigest 具有 8 位编码的特殊原因(这实际上意味着“这是原始数据”,但 ruby​​ 似乎就是这样做的。当 ruby​​ sqlite3 驱动程序看到带有 ascii-8bit 编码的东西时它将值作为 blob 而不是文本绑定到查询。这反过来会影响 sqlite3 进行比较的方式(尽管我不完全理解如何)。

另见this question

【讨论】:

    【解决方案2】:

    解决办法是:

    不要使用 Digest::MD5.hexdigest("foobar"),而是使用 Digest::MD5.base64digest("foobar")。 我不知道为什么 sqlite3 的 hexdigest 有问题,但是这肯定有问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-21
      • 1970-01-01
      • 2019-12-11
      • 2011-09-09
      • 2021-09-10
      • 1970-01-01
      • 1970-01-01
      • 2015-02-01
      相关资源
      最近更新 更多