【问题标题】:VB/VBScript - Comparing a binary value in a WHERE statement (SQL Server)VB/VBScript - 比较 WHERE 语句中的二进制值 (SQL Server)
【发布时间】:2011-04-25 20:49:29
【问题描述】:

当我尝试运行这样的 SQL 语句时遇到类型不匹配错误:

Dim s
s = "test"
"SELECT id FROM mytable WHERE sha1bin = " & SHA1bin(s)

这是我的 SHA1bin 函数:

Private Function SHA1Bin(s)
    Dim asc, enc, bytes
    Set asc = CreateObject("System.Text.UTF8Encoding")
    Set enc = CreateObject("System.Security.Cryptography.SHA1CryptoServiceProvider")
    bytes = asc.GetBytes_4(s)
    SHA1Bin = enc.ComputeHash_2((bytes))
    Set asc = Nothing
    Set enc = Nothing
End Function

据我了解,VBScript 并没有真正的二进制数据类型。我需要做什么来进行这种比较,还是应该将其存储为 40 个字符的十六进制值,以便进行文本比较?

【问题讨论】:

  • 您使用的是哪个版本的 SQL Server?另外,你试过"SELECT id FROM mytable WHERE sha1bin = '" & SHA1bin(s) & "'"吗?
  • SQL Server 2008 速成版。我用引号试过了,没有用。 SQL Server 2008 确实有一个 HashBytes 函数。如果我将代码更改为使用存储过程,我想我可以使用它。有什么方法可以在我的 SQL 语句中使用该函数?

标签: sql sql-server asp-classic vbscript binary-data


【解决方案1】:

ComputeHash_2 返回一个字节数组。

首先,将字节数组转换为十六进制字符串:

Dim pos,hexs
For pos = 1 To Lenb(bytes) ' bytes is your resulting byte array '
 hexs = hexs & LCase(Right("0" & Hex(Ascb(Midb(bytes, pos, 1))), 2))
Next

然后,对比一下T-SQL的CONVERT:

Dim Query
Query="SELECT id FROM mytable WHERE sha1bin = CONVERT(varbinary(max), 0x" & hexs & ")"

【讨论】:

  • 您的解决方案运行良好。实际上,我只是更改了上面的函数,使其返回十六进制而不是二进制。换句话说,我在我的 SHA1 函数中插入了您的第一段代码。我无法进行任何真正的科学测试,但我的代码现在运行得更快了,因为能够通过哈希值而不是比较全文字符串来查找行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
  • 2013-11-25
  • 2011-07-20
  • 2011-08-11
相关资源
最近更新 更多