首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server VARBINARY 轉 VARCHAR 完整解決方案:CONVERT 截斷問題與 xp_varbintohexstr 正確用法

     編輯:關於SqlServer

問題現象

欄位型別 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); -- 仍被截斷

正確解法:系統擴展預存程序 xp_varbintohexstr


DECLARE @b varbinary(300), @str varchar(300);
SELECT @b = 0x06555755565A5A5B595F5C5C5C41434142464647454B4848484D4F4D4EB2B2B3;
EXEC master..xp_varbintohexstr @b, @str OUTPUT;
PRINT @str;  -- 0x06555755565A5A5B595F5C5C5C41434142464647454B4848484D4F4D4EB2B2B3
  • 專為 **varbinary → 十六進位字串** 設計
  • 輸出含 0x 前綴,長度無 8000 限制 (受 @str 變數長度限制)
  • 需在 master 資料庫執行或具備執行權限

替代方案 (SQL 2008+ / 不依賴擴展預存程序)


-- 利用 CONVERT style 1 (二進位→帶 0x 字串) + XML 技巧繞過長度限制
SELECT CONVERT(varchar(max), @b, 1);  -- style=1 保留 0x 前綴,varchar(max) 避免截斷
-- 注意:CONVERT(varbinary→varchar, 1) 在某些版本仍有 8000 限制,建議測試後使用

反向操作:十六進位字串 → VARBINARY


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 函數封裝。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved