sql-server - 将十六进制字符串转换为整数的样式
问题描述
我在 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 是正确的还是我错了,从一开始就尝试使用这种转换?
解决方案
正如 GSerg 在评论中指出的那样,此值太大而无法转换为 SQL Serverint
或bigint
类型 - 如果这样做,您将丢失字节。如果你运行,你可以看到这个:
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
字符)
推荐阅读
- postgresql - PostgreSQL 创建物化视图,根据字段和表列将 JSON 数组中的对象汇总到特定列中
- c++ - 如何将我的代码中的 int 变量作为二进制文件推送到文本文件中?
- python - 如何处理错误或再次尝试使用 python 发布到 pubsub 消息谷歌
- c# - 如何在 C# 中搜索 JSON 文件以查找特定值?
- kubernetes - Terraform GKE x509:由未知机构签署的证书
- javascript - 如何通过javascript更改`link`中的`href`
- c# - 使用 Datetime.UTC 设置西中非时间
- android - Ubuntu:Android Studio 中的虚拟设备
- r - plotly_selected 在 R 中不起作用
- foreach - 如果列表行在 SwiftUI 中包含文本字段,则无法从 foreach 中删除元素