2017-01-03 2 views
0

Администратор нашего ИБ хранит 8 таких символов, как «00010000» (только true и false) для SQL Server как binary(2). В этом формате данные имеют значения, такие как «0x1000».SQL Server: как преобразовать двоичный код обратно в int

Можно ли преобразовать этот двоичный код обратно в '00010000'?

Convert, Cast, Substring не работает.

+0

Действительно ли это «0x1000», то же значение, что и «00010000»? – jarlh

+0

Да. Когда у меня есть значения из IS '00010000', тогда в SQL есть значение '0x1000'. Но если у меня есть, например, «00110000», то значение равно «0x3000». –

ответ

0

Запрос возвращает шестнадцатеричное число (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 
0

Ваши исходные данные, скорее всего, утеряны. При преобразовании числа в двоичный код в SQL существует только ограниченное количество «пространства» для хранения этих данных, пространство определяется размером байта поля, в этом случае 2.

Проблема возникает, когда данные сохраняются в базе данных, используя двоичный (2) означает, что данные усекаются при сохранении, что означает, что вы потеряли по крайней мере 4 первых «флага» в ваших данных. (4 номера в начале вашего двоичного номера).

, например, ниже показывает, какие магазины SQL для числа 10010010 в двоичном 6, 4 и 2.

Binary(6) - 0x00000098BD9A 
Binary(4) - 0x0098BD9A 
Binary(2) - 0xBD9A 

, как вы можете видеть с помощью двоичного 2 означает, что вы потеряете данные из вашего номера. Это исчезло и не может быть восстановлено с помощью БД (если вы не сохраните журналы транзакций, которые, если у вас есть DBA, сохраняющий логические значения в виде 8-битового блока с использованием двоичного (2) поля, я сомневаюсь, что у вас есть). Так жаль это сказать, но вы просто не можете делать то, что вам нужно, и это тот, кто думал, что использовать двоичный код (2) для 8-значного числа, был хорошей идеей, а затем не проверял их решение, которое виновато.

+0

Так что перед вставкой в ​​sql должно быть что-то еще, если я получаю результат «0x9200», когда я тестирую ваш пример «10010010»? Это объясняет, почему они могут восстановить данные в исходный «массив». –

+0

Если у вас есть программа, способная перевести сохраненные значения в исходное 8-значное значение успешно 100% времени, тогда да, должен быть слой перевода между входом и базой данных. – Kamikazi

0

Да, вы можете

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 
Смежные вопросы