【问题标题】:How to set varbinary column in SQL server如何在 SQL Server 中设置 varbinary 列
【发布时间】:2015-10-09 16:07:51
【问题描述】:

我正在尝试通过以下 SQL 更新类型为 VARBINARY(MAX) 的列:

UPDATE dbo.__MigrationHistory 
SET Model = 0x1F8B080000000000046
WHERE MigrationId = '201510051415248_Test2'

我希望该列设置为0x1F8B080000000000046,但它设置为0x01F8B080000000000046

如何将模型设置为所需的值:0x1F8B080000000000046

谢谢

更新 1。

0x1F8B080000000000046 只是我设法复制问题的随机值。我没有输入原始值,因为它由 43679 个符号组成。 MOST 令人困惑的是数据库中已经存在相同的值,我正在从另一行复制该值并将其粘贴到我的更新查询中,但是如果从选择中更新它,它将起作用,例如:

UPDATE dbo.__MigrationHistory
SET Model = (
        SELECT Model
        FROM dbo.__MigrationHistory
        WHERE MigrationId = '201510041415248_Test1'
        ) -- is equal to 0x1F8B080000000000046
WHERE MigrationId = '201510051415248_Test2'

但显然我不能在最初没有该值的数据库上使用这种方法。

【问题讨论】:

  • 所以你想将它的长度设置为小数字节?
  • @hvd 我只希望 0x1F8B080000000000046 值出现在我的表中的模型列中
  • @AlexK。确定不相关?但是,如果我正在更新的值具有 MAX 长度,并且由于多余的前导 0 最后一个字符被修剪掉并且我得到无效的 varbinary,该怎么办?
  • @Vladimirs:您只能存储整个字节的值,因此您要求的内容是不可能的。那么问题来了,为什么要设置那个特定的值呢?
  • @Vladimirs:varbinary 文字没有 43679 个字符,它必须是偶数。复制时可能会得到一个连接值。

标签: sql sql-server sql-server-2008 varbinary


【解决方案1】:

0x开头的varbinary值是十六进制格式。

在十六进制格式中,值必须由偶数位数组成。

SQL Server 正在尝试将值设置为 0x1F8B080000000000046,但由于它的位数为奇数,SQL Server 会在开头添加额外的 0,以使该值成为有效的十六进制值。

在不了解您的数据的情况下,我会说您可能打算将其设置为:0x1F8B0800000000000046

您是否尝试将46 附加到0x1F8B08?如果是这样,您必须确保添加正确数量的零以得到偶数位数。

【讨论】:

  • 感谢您的解释,原始值确实有奇数位数(43677 不包括 0x),但这是我已经在数据库中看到的值 - 问题是我不能将其用作值(见更新 1)。
【解决方案2】:

显示的 varbinary 不包含奇数位数。该值包含特定数量的字节,每个字节显示为两位数。

(你可以写一个奇数位数的二进制文字,例如0x123,但它的含义与0x0123相同。)

当您复制具有 43679 位数字的值时,它不是来自数据库的正确值。很可能是因为它被连接起来了,无论是在显示时还是在您复制时。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多