欄位型別 varbinary,值 0x06555755565A5A5B595F5C5C5C41434142464647454B4848484D4F4D4EB2B2B3。
直接 CONVERT(varchar, col) 或 CAST(col AS varchar(8000)) 會將二進位視為字元編碼轉換,產生亂碼或截斷,無法得到 **十六進位字串字面值**。
SELECT CONVERT(varchar, col) FROM t; -- WUVZZ[Y_\\\ACABFFGEKHHHMOMN (誤)
SELECT CONVERT(varchar(8000), col) FROM t; -- 同前,截斷
SELECT CAST(CAST(0x... AS varchar(8000)) AS varbinary); -- 仍被截斷
DECLARE @b varbinary(300), @str varchar(300);
SELECT @b = 0x06555755565A5A5B595F5C5C5C41434142464647454B4848484D4F4D4EB2B2B3;
EXEC master..xp_varbintohexstr @b, @str OUTPUT;
PRINT @str; -- 0x06555755565A5A5B595F5C5C5C41434142464647454B4848484D4F4D4EB2B2B3
0x 前綴,長度無 8000 限制 (受 @str 變數長度限制)master 資料庫執行或具備執行權限
-- 利用 CONVERT style 1 (二進位→帶 0x 字串) + XML 技巧繞過長度限制
SELECT CONVERT(varchar(max), @b, 1); -- style=1 保留 0x 前綴,varchar(max) 避免截斷
-- 注意:CONVERT(varbinary→varchar, 1) 在某些版本仍有 8000 限制,建議測試後使用
DECLARE @hex varchar(300) = '0x06555755565A5A5B595F5C5C5C41434142464647454B4848484D4F4D4EB2B2B3';
SELECT CONVERT(varbinary(max), @hex, 1); -- style=1 解析 0x 開頭字串
-- 或
EXEC master..xp_hexstrtovarbin @hex, @bin OUTPUT;
核心結論:**CONVERT/CAST 直接轉型會按字元編碼解讀二進位**,非十六進位字面值。**xp_varbintohexstr** 是舊版標準解法;新版 (2008+) 可嘗試 CONVERT(varchar(max), @bin, 1),但實測仍可能受 8000 字元限制,最穩妥仍是擴展預存程序或 CLR 函數封裝。