首页 > 解决方案 > 将十六进制字符串转换为整数的样式

问题描述

我在 SQL Server 中有一个字段,属于一个古老的应用程序,我不确定这个字段代表哪种数据

我知道这个字段是主键,并想通过它来排序,使用转换为整数。我发现转换支持多种样式

SELECT TOP(5000) oid,
convert(int, convert(varbinary, oid,2)) as Style2,
convert(int, convert(varbinary, oid,0)) as Style0

结果成

C9AEEC304776000200FD000000710005    7405573     925970480
C9AEEC304776000200FD000000980007    9961479     959983664
C9AEEC304776000200FD000000980008    9961480     959983664
C9AEEC304776000200FD000000980009    9961481     959983664
C9AEEC304776000200FD00000098000A    9961482     959983664
C9AEEC304776000200FD000001180001    18350081    825765936
C9AEEC304776000200FD000001180002    18350082    825765936
C9AEEC304776000200FD000001180003    18350083    825765936

似乎样式 0 跳过了一些最终字符。样式号 2 是正确的还是我错了,从一开始就尝试使用这种转换?

标签: sql-server

解决方案


正如 GSerg 在评论中指出的那样,此值太大而无法转换为 SQL Serverintbigint类型 - 如果这样做,您将丢失字节。如果你运行,你可以看到这个:

SELECT CAST(CAST(0xC9AEEC304776000200FD000000710005 AS INT) AS VARBINARY(16))

这将返回0x00710005- 输入值的最后四个字节


要回答有关二进制转换样式的问题(即使您现在可能不需要它):

  • 样式 0 等效于SELECT CAST(CAST('C9AEEC304776000200FD000000710005' AS VARBINARY) AS INT)- 即该值作为字符串转换为二进制。

  • 样式 2 将字符串视为十六进制 - 功能上等同于SELECT CAST(0xC9AEEC304776000200FD000000710005 AS INT)

  • (虽然你没有问,样式 1 和样式 2 一样,但要求十六进制字符串值包含前导0x字符)


推荐阅读