我们的 IS 管理员将 8 个标志,如 '00010000'(只有真假)存储到 SQL Server 为binary(2)
. 在这种格式中,数据的值类似于“0x1000”。
是否可以将此二进制文件转换回 '00010000' ?
Convert
, Cast
,Substring
不工作。
我们的 IS 管理员将 8 个标志,如 '00010000'(只有真假)存储到 SQL Server 为binary(2)
. 在这种格式中,数据的值类似于“0x1000”。
是否可以将此二进制文件转换回 '00010000' ?
Convert
, Cast
,Substring
不工作。
查询返回十六进制数(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
您的原始数据很可能会丢失。在 SQL 中将数字转换为二进制时,只有有限的“空间”来存储该数据,空间由字段的字节大小决定,在本例中为 2。
将数据保存到数据库时会出现此问题,使用二进制 (2) 意味着数据在保存时被截断,这意味着您至少丢失了数据中的 4 个前“标志”。(二进制数开头的 4 个数字)。
例如,下面显示了 SQL 以二进制 6、4 和 2 存储数字 10010010 的内容。
Binary(6) - 0x00000098BD9A
Binary(4) - 0x0098BD9A
Binary(2) - 0xBD9A
如您所见,使用二进制 2 意味着您丢失了号码中的数据。那已经消失了,并且无法使用 DB 进行检索(除非您保存事务日志,假设您有一个 DBA 使用 binary(2) 字段将布尔值存储为 8 位块,我怀疑您有)。很抱歉这么说,但您根本无法做您需要做的事情,而且无论谁认为使用二进制(2)作为 8 位数字是一个好主意,然后没有测试他们的决定,这都是罪魁祸首。
是的你可以
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