【问题标题】:Convert string to varbinary - Comparing the two将字符串转换为 varbinary - 比较两者
【发布时间】:2014-06-19 20:19:36
【问题描述】:

我需要将字符串转换为 varbinary(85),这是我的 SQL Server 表中的数据类型(无法更改)。该数据用于用户名,我需要将登录网站的人的 Windows 用户名与此 SQL 数据条目进行比较。我在数据库中的登录示例是:

0x0105000000000005150000004CCDD8292B55E7A8CD006C0E061F0012 是数据类型 varbinary(85) 的。

现在我需要将其与字符串进行比较。我将字符串转换为 varbinary(85) 以便获得完全相同的值的最佳方法是什么。

我最好在 C# 中完成这一切,尽管我想我可以在 SQL 的数据库端完成。

回答:

使用 sql 我可以完美地生成名称。

SELECT SUSER_SID(string)

【问题讨论】:

  • 这看起来像一个散列条目。使用什么算法对其进行哈希处理?当然,这不仅仅是一个简单的select convert(varbinary(85),name)
  • 不完全确定。它是 Microsoft 产品 (SCVMM),所以可能是 SHA-256?而且你我已经尝试了一堆这样的东西无济于事

标签: c# sql-server varbinary


【解决方案1】:

1) 我会在 varbinary(85) 列上创建一个 [唯一] 索引:

CREATE UNIQUE INDEX IUN_Users_UserName 
ON dbo.Users (UserName) -- Where UserName is varbinary(85)

2) 我会使用相同的算法将当前用户名转换为varbinary(85)

DECLARE @binCurrentUserName VARBINARY(85);
SET @binCurrentUserName = .... convert here the current user name to VB(85) ...

我只会比较 varbinary 值:

SELECT u.UserID
FROM dbo.Users u
WHERE u.UserName = @binCurrentUserName -- Please remember that UserName's type is VB(85)

注意:将 varbinary 值从 UserName 列转换为字符串 (nvarchar) 这是一个坏主意,因为 SQL 查询看起来像这样

SELECT u.UserID
FROM dbo.Users u
WHERE CONVERT(... u.UserName ... ) = @nvarcharCurrentUserName 

因为将是一个应用于UserName 列的函数(例如CONVERT),这将阻止Index Seek => 此查询的执行计划将包含一个Index Scan 运算符。

【讨论】:

  • 刚刚发现我是怎么做到的!通过浏览内置函数。谢谢你的信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-28
  • 2015-07-12
  • 1970-01-01
  • 2011-06-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多