2015-02-17 3 views
4

Я делаю INSERT SELECT из таблицы (источника), где каждый столбец имеет тип данных VARCHAR.Преобразование BINARY, хранящегося как VARCHAR, в BINARY

Один из столбцов хранит двоичные данные, такие как

'0003f80075177fe6' 

В таблице назначения, где я вставить это, имеет ту же колонку, но с правильным типом данных BINARY(16).

INSERT INTO destination 
(
    column1,  --type of BINARY(16) 
    ... 
) 
SELECT 
    CONVERT(BINARY(16),[varchar_column_storing_binary_data]), --'0003f80075177fe6' 
FROM source 
GO 

Когда я ввожу его, а затем выберите целевую таблицу, я получил другое значение из BINARY16 колонки:

0x30303033663830303735313737666536 

Это не очень похоже, то же значение.

Каким должен быть правильный способ преобразования двоичных данных, хранящихся как VARCHAR, в BINARY?

ответ

7

Результат получается потому, что строка «0003f80075177fe6» (значение VARCHAR) преобразуется в кодовые точки, и эти кодовые точки подаются в виде двоичного значения. Поскольку вы, вероятно, используете сопоставление ASCII-совместимости, это означает, что вы получаете коды ASCII: 0 - 48 (30 hex), f - 102 (66 hex) и так далее. Это объясняет, что 30 30 30 33 66 38 30 30...

Вместо этого вы должны проанализировать строку как шестнадцатеричное представление байтов (00 03 f8 00 75 71 77 fe 66). CONVERT принимает дополнительный параметр «стиль», который позволяет конвертировать hexstrings:

SELECT CONVERT(BINARY(16), '0003f80075177fe6', 2) 

Стиль 2 преобразует шестнадцатеричной в двоичную. (Стиль 1 делает то же самое для строк, которые начинаются с «0x», что здесь не так.)

Обратите внимание, что если количество символов меньше 16 байт (как в этом случае), значение равномерно дополняется ноль (0x0003F80075177FE60000000000000000). Если вам это нужно левая кнопка проложенного вместо этого, вы должны сделать это сам:

SELECT CONVERT(BINARY(16), RIGHT(REPLICATE('00', 16) + '0003f80075177fe6', 32), 2) 

Наконец, следует отметить, что бинарные литералы могут быть указаны без преобразования просто предваряя их с «0x», а не с помощью цитаты: SELECT 0x0003f80075177fe6 вернется столбец типа BINARY(8). Не релевантно для этого запроса, а только для полноты.

+0

hey Jeroen это работает ... его неинтуитивно для меня, но это имеет смысл в конце ... я бы обнял вас, если бы вы были здесь, спасибо! – Avithohol

+2

Я расширил ответ, пытаясь устранить любую путаницу. –