Sql-Server

比較二進制 0x 和 0x00 在 SQL Server 上結果是相等的

  • August 30, 2013

似乎 SQL Server 認為 0x 和 0x00 相等:

SELECT CASE WHEN 0x = 0x00 THEN 1 ELSE 0 END

這輸出1.

如何獲得真正的二進制逐位比較行為?另外,兩個值被認為相等的確切規則是什麼?(var)binary

另請注意以下行為:

--prints just one of the values
SELECT DISTINCT [Data]
FROM (VALUES (0x), (0x00), (0x0000)) x([Data])

--prints the obvious length values 1, 2 and 3
SELECT DATALENGTH([Data]) AS [DATALENGTH], LEN([Data]) AS [LEN]
FROM (VALUES (0x), (0x00), (0x0000)) x([Data])

問題的背景是我正在嘗試對二進制數據進行重複數據刪除。我需要GROUP BY二進制數據,而不僅僅是比較兩個值。我很高興我什至注意到了這個問題。

請注意,這HASHBYTES不支持 LOB。我也想找到一個更簡單的解決方案。

我在 BOL 的任何地方都找不到這種比較行為。

但是對於帶有右填充零的 varbinary 數據的 Connect Item Invalid 相等性比較表明

基本上,該標準將其留給實現來處理僅通過以下方式不同的字元串

$$ trailing $$ 00等於或小於。我們平等對待。

連接項還指出尾隨零的存在是 SQL Server 與逐字節比較行為不同的唯一情況。

為了區分 SQL Server 中僅通過尾隨0x00字元不同的兩個二進制值,您還可以DATALENGTH按照問題中的指示添加到比較中。

首選DATALENGTH而不是LEN一般的原因是因為後者給出了隱式轉換varchar,然後你就會遇到尾隨空格的問題。

+-------------+--------------------+
| LEN(0x2020) | DATALENGTH(0x2020) |
+-------------+--------------------+
|           0 |                  2 |
+-------------+--------------------+

儘管兩者都適用於您的案例。

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