Резултатът, който получавате, е защото низът "0003f80075177fe6" (a VARCHAR
стойност) се преобразува в кодови точки и тези кодови точки се сервират като двоична стойност. Тъй като вероятно използвате ASCII-съвместима колация, това означава, че получавате ASCII кодовите точки:0
е 48 (30 шестнадесетичен), f
е 102 (66 шестнадесетичен) и така нататък. Това обяснява 30 30 30 33 66 38 30 30...
Това, което искате да направите вместо това, е да анализирате низа като шестнадесетично представяне на байтовете (00 03 f8 00 75 71 77 fe 66
). CONVERT
приема допълнителен параметър "стил", който ви позволява да конвертирате шестнадесетични низове:
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)
. Не е от значение за тази заявка, но само за пълнота.