【问题标题】:Additional 0 in varbinary insert in SSMSSSMS 中的 varbinary 插入附加 0
【发布时间】:2018-11-21 14:48:29
【问题描述】:

我在尝试将 varbinary(max) 字段从一个数据库移动到另一个数据库时遇到问题。 如果我这样插入: 0xD0CF11E0A1B11AE10000000 它以额外的“0”开头: 0x0D0CF11E0A1B11AE10000000

我无法摆脱这个。我尝试了很多工具,例如 SSMS 导出工具或 BCP,但没有任何成功。无论如何,我最好在脚本中解决它。

而且没有太多关于 varbinary 的知识(一个程序生成它),我唯一的目标就是复制它:)

【问题讨论】:

  • 无效文字....十六进制数字的奇数 - 必须是偶数。
  • 十六进制表示的每个字符代表一个半字节。 Varbinary 以字节为单位工作。您的第一个表达式包含 23 个十六进制字符。

标签: sql sql-server varbinary


【解决方案1】:
0xD0CF11E0A1B11AE10000000

此值包含奇数个字符。 Varbinary 存储字节。每个字节由正好两个十六进制字符表示。您要么丢失了一个字符,要么没有存储字节。

这里,SQL Server 猜测最高有效位是零,这不会改变字符串的数值。例如:

select 0xD0C "value"
    ,cast(0xD0C as int) "as_integer"
    ,cast(0x0D0C as int) "leading_zero"
    ,cast(0xD0C0 as int) "trailing_zero"


 value       3_char     leading_zero     trailing_zero    
 ----------  ---------  ---------------  ---------------- 
 0d0c        3340       3340             53440            

或者:

select 1 "test"
where 0xD0C = 0x0D0C

 test    
 ------- 
 1       

这只是 SQL Server 假设 varbinary 始终表示字节的区别。

【讨论】:

  • 是的,你是对的,这解决了问题。奇怪的是,我原来的 varbinary 字段也包含奇数个字符......(这就是我试图复制它的原因)。知道怎么可能吗?
  • 另外两个零完成了这项工作!谢谢;)
  • @landonhand115 这完全取决于您的系统选择如何表示价值。例如,任意十六进制数当然可以有奇数位数。只是 SQL Server 说十六进制值被解释为字节。
  • @landonhand115 两个零?
猜你喜欢
  • 1970-01-01
  • 2015-10-25
  • 2020-10-02
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多