我的表中有一个用户密码字段,该字段具有varbinary数据类型,所以我困惑应该以哪种形式将数据保存到用户密码字段中,因为当我保存varchar数据时,它会给出错误。
我的表中有一个用户密码字段,该字段具有varbinary数据类型,所以我困惑应该以哪种形式将数据保存到用户密码字段中,因为当我保存varchar数据时,它会给出错误。
varbinary
列可以存储任何内容。如果要将字符串存储在其中,您需要将其转换为varbinary
:
declare @t table (id int identity, pwd varbinary(50))
insert into @t (pwd) values (cast('secret' as varbinary(50)))
但是对于密码来说,varbinary
列通常存储某种哈希值。例如,使用HashBytes
函数生成的SHA1哈希值:
insert into @t (pwd) values (HashBytes('sha1', 'secret'));
存储单向哈希而不是真实密码更加安全。您可以检查密码是否匹配:
select * from @t where pwd = HashBytes('sha1', 'secret')
但是通过查看表格,您无法检索密码。因此,只有最终用户知道他的密码,甚至DBA也无法检索它。
你需要显式地将VARCHAR转换。
SELECT CAST(N'Test' as VARBINARY)
SQL Server错误信息如下。
不允许从数据类型varchar隐式转换为varbinary。
根据MSDN中CAST和CONVERT的大表,SQL Server需要对varchar到varbinary进行显式转换。
该表将具有一个varbinary列,以存储哈希值,如sys.sql_logins所示。
SELECT CAST(N'Test' as VARBINARY)
------你必须给它一个大小 ---------->
SELECT CAST(N'Test' as VARBINARY(30))