Sql-Server

在 SQLServer 中將 varbinary 數據轉換為 varchar 會導致意外結果

  • February 7, 2017

我需要修復 SQL Server 2008 中的一些數據轉換問題。我對儲存數據有一些要求。我毫不在意地將現有varbinary數據轉換為varchar使用CONVERT(NVARCHAR(max), @bytearraydata, 1).

C# 中的相同轉換是使用Encoding.Default.GetStringandEncoding.Default.GetBytes方法完成的。Encoding.Default.GetBytes(string)像以前一樣取回字節數組。但是當我嘗試取回我使用轉換的字元串的字節數組時,我CONVERT() 得到了錯誤的結果。

我的工作是獲取儲存為數據庫字元串的字節數組並將其轉換為字節數組,最後將內容呈現為 PDF。通過編碼機制的數據(在保存和獲取時)對我來說很好。但是,當我嘗試獲取使用CONVERT它轉換的數據時,無法生成 PDF。

我該如何解決這個問題?

概括:

字節數組列已更改為字元串。

使用此功能完成的現有數據轉換:

Convert(NVARCHAR(MAX), @bytearraydata, 1)

在應用程序中字節數組轉換是使用Encoding.Default.GetString(bytearraydata)

是否Encoding兼容CONVERT

使用時Encoding.Default的結果取決於本地設置:

作業系統目前 ANSI 程式碼頁的編碼。

該規範非常直接地說明了使用預設編碼的危險,並且非常明確地提出了使用它的建議:

不同的電腦可以使用不同的編碼作為預設編碼,甚至可以在單台電腦上更改預設編碼。因此,從一台電腦流式傳輸到另一台電腦或什至在同一台電腦上的不同時間檢索的數據可能會被錯誤地翻譯。此外,預設屬性返回的編碼使用最佳匹配回退將不受支持的字元映射到程式碼頁支持的字元。由於這兩個原因,一般不推薦使用預設編碼

現在,無論出於何種原因,您都希望隨機的目前本地編碼與伺服器編碼相匹配。即使該CONVERT函式會執行您認為它會執行的操作,結果也會是隨機且不可預測的,因為:

  • 伺服器本地程式碼頁可能與客戶端程式碼頁不同。
  • 程式碼頁更改會使持久化數據不可讀,因為它是用一種編碼編寫的,然後又試圖用另一種編碼讀取。

此外,CONVERT符合您的期望。CONVERT將使用 UCS-2 編碼將 aVARBINARY轉換為a NVARCHAR,因為這是 SQL Server 用於 NVARCHAR 數據的編碼。

我建議您首先閱讀這篇文章《每個軟體開發人員絕對、絕對必須了解 Unicode 和字元集(沒有任何藉口!)》來解決您的緊迫問題。跟進SQL Server 的國際注意事項

引用自:https://dba.stackexchange.com/questions/56266