SQL服务器:如何将二进制转换回整数
SQL Server : how to convert binary back to int
我们 IS 的管理员存储了 8 个标志,例如“00010000”(只有 true 和 false)到 SQL 服务器,作为 binary(2)
。在这种格式中,数据的值类似于“0x1000”。
是否可以将此二进制文件转换回“00010000”?
Convert
、Cast
、Substring
无效。
您的原始数据很可能丢失了。当您在 SQL 中将数字转换为二进制时,只有有限数量的 "space" 可以存储该数据, space 由字段的字节大小决定,在本例中为 2 .
当数据保存到数据库时出现问题,使用二进制(2)意味着数据在保存时被截断,这意味着您至少丢失了数据中的前4 "flags"。 (二进制数开头的 4 个数字)。
例如,下面显示了 SQL 为二进制 6、4 和 2 中的数字 10010010 存储的内容。
Binary(6) - 0x00000098BD9A
Binary(4) - 0x0098BD9A
Binary(2) - 0xBD9A
如您所见,使用二进制 2 意味着您丢失了号码中的数据。那已经消失并且无法使用数据库检索(除非您保存事务日志,假设您有一个 DBA 使用二进制(2)字段将布尔值存储为 8 位块,我怀疑您有)。很抱歉这么说,但你根本无法做你需要做的事,而且认为将 binary(2) 用于 8 位数字的人是个好主意,然后没有测试他们的决定,这才是罪魁祸首。
查询returns十六进制数(0x... - 它是十六进制)作为其位掩码
CREATE TABLE #Temp(
Test VARBINARY(2)
)
INSERT #Temp
VALUES
(0x1001),
(0x3001),
(0x5000),
(0x6000),
(0xf000),
(0xf250)
SELECT *, REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
CONVERT(VARCHAR(32), Test, 2)
, '0', '0000')
, '1', '0001')
, '2', '0010')
, '3', '0011')
, '4', '0100')
, '5', '0101')
, '6', '0110')
, '7', '0111')
, '8', '1000')
, '9', '1001')
, 'a', '1010')
, 'b', '1011')
, 'c', '1100')
, 'd', '1101')
, 'e', '1110')
, 'f', '1111')
FROM #Temp
DROP TABLE #Temp
是的,你可以
BINARY(2)
表示2个字节,所以16位
0x3000 = '0011000000000000'
declare @v int = 0x3000
;WITH
T AS ( SELECT NULL N UNION ALL SELECT NULL ),
N as (
SELECT ROW_NUMBER() OVER (ORDER BY T2.N) N
FROM T T2, T T4, T T8, T T16
),
V AS (
select N, POWER(2,N-1) P, CAST(@v as binary(2)) b2, @v V
from N
),
B AS (
SELECT N, B2, CAST((V/P) % 2 AS char(1)) B
from V
)
SELECT B2, [16]+[15]+[14]+[13]+[12]+[11]+[10]+[9]+[8]+[7]+[6]+[5]+[4]+[3]+[2]+[1] BASE2
FROM B
PIVOT ( MIN(B) FOR N IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16]) ) P
输出
B2 BASE2
0x3000 0011000000000000
我们 IS 的管理员存储了 8 个标志,例如“00010000”(只有 true 和 false)到 SQL 服务器,作为 binary(2)
。在这种格式中,数据的值类似于“0x1000”。
是否可以将此二进制文件转换回“00010000”?
Convert
、Cast
、Substring
无效。
您的原始数据很可能丢失了。当您在 SQL 中将数字转换为二进制时,只有有限数量的 "space" 可以存储该数据, space 由字段的字节大小决定,在本例中为 2 .
当数据保存到数据库时出现问题,使用二进制(2)意味着数据在保存时被截断,这意味着您至少丢失了数据中的前4 "flags"。 (二进制数开头的 4 个数字)。
例如,下面显示了 SQL 为二进制 6、4 和 2 中的数字 10010010 存储的内容。
Binary(6) - 0x00000098BD9A
Binary(4) - 0x0098BD9A
Binary(2) - 0xBD9A
如您所见,使用二进制 2 意味着您丢失了号码中的数据。那已经消失并且无法使用数据库检索(除非您保存事务日志,假设您有一个 DBA 使用二进制(2)字段将布尔值存储为 8 位块,我怀疑您有)。很抱歉这么说,但你根本无法做你需要做的事,而且认为将 binary(2) 用于 8 位数字的人是个好主意,然后没有测试他们的决定,这才是罪魁祸首。
查询returns十六进制数(0x... - 它是十六进制)作为其位掩码
CREATE TABLE #Temp(
Test VARBINARY(2)
)
INSERT #Temp
VALUES
(0x1001),
(0x3001),
(0x5000),
(0x6000),
(0xf000),
(0xf250)
SELECT *, REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
CONVERT(VARCHAR(32), Test, 2)
, '0', '0000')
, '1', '0001')
, '2', '0010')
, '3', '0011')
, '4', '0100')
, '5', '0101')
, '6', '0110')
, '7', '0111')
, '8', '1000')
, '9', '1001')
, 'a', '1010')
, 'b', '1011')
, 'c', '1100')
, 'd', '1101')
, 'e', '1110')
, 'f', '1111')
FROM #Temp
DROP TABLE #Temp
是的,你可以
BINARY(2)
表示2个字节,所以16位
0x3000 = '0011000000000000'
declare @v int = 0x3000
;WITH
T AS ( SELECT NULL N UNION ALL SELECT NULL ),
N as (
SELECT ROW_NUMBER() OVER (ORDER BY T2.N) N
FROM T T2, T T4, T T8, T T16
),
V AS (
select N, POWER(2,N-1) P, CAST(@v as binary(2)) b2, @v V
from N
),
B AS (
SELECT N, B2, CAST((V/P) % 2 AS char(1)) B
from V
)
SELECT B2, [16]+[15]+[14]+[13]+[12]+[11]+[10]+[9]+[8]+[7]+[6]+[5]+[4]+[3]+[2]+[1] BASE2
FROM B
PIVOT ( MIN(B) FOR N IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12],[13],[14],[15],[16]) ) P
输出
B2 BASE2
0x3000 0011000000000000