【问题标题】:What data can be stored in varbinary data type of SQL Server?SQL Server的varbinary数据类型可以存储哪些数据?
【发布时间】:2011-03-17 13:48:23
【问题描述】:

我有一个表,其中 userpassword 字段具有 varbinary 数据类型,所以我很困惑我应该以哪种形式将数据保存到 userpassword 字段中,因为当我保存 varchar 数据时它给了我错误。

【问题讨论】:

    标签: sql sql-server types varbinary


    【解决方案1】:

    varbinary 列可以存储任何内容。要在其中存储字符串,您必须将其转换为 varbinary

    declare @t table (id int identity, pwd varbinary(50))
    insert into @t (pwd) values (cast('secret' as varbinary(50)))
    

    但对于密码,varbinary 列通常存储某种散列。例如,使用 HashBytes function 的 SHA1 哈希:

    insert into @t (pwd) values (HashBytes('sha1', 'secret'));
    

    存储单向哈希而不是真实密码更安全。您可以检查密码是否匹配:

    select * from @t where pwd = HashBytes('sha1', 'secret')
    

    但是您无法通过查看表格来找回密码。所以只有最终用户知道他的密码,即使是 DBA 也无法找回它。

    【讨论】:

    • 我可以像音频文件一样存储原始文件吗?
    • @JerryGoyal 是的。通常做的另一件事是将较大的文件存储在磁盘上,而只是将文件路径存储在数据库中
    【解决方案2】:

    您需要显式转换 VARCHAR。

    SELECT CAST(N'Test' as VARBINARY)
    

    SQL Server 错误消息说。

    从数据类型 varchar 到 varbinary 的隐式转换不是 允许。

    【讨论】:

      【解决方案3】:

      根据 MSDN 中 CAST 和 CONVERT 的大表,SQL Server 需要从 varchar to varbinary 进行显式转换

      该表将有一个 varbinary 列来存储按照 sys.sql_logins 的哈希值

      【讨论】:

        【解决方案4】:
        SELECT CAST(N'Test' as VARBINARY)
        

        ------你必须给它一个大小 ---------->

        SELECT CAST(N'Test' as VARBINARY(30))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-03-16
          • 1970-01-01
          • 2015-06-18
          • 1970-01-01
          • 2012-02-29
          • 2014-06-11
          • 2023-03-20
          • 1970-01-01
          相关资源
          最近更新 更多