不幸的是,Martin 提出的解决方案存在缺陷。
如果搜索关键字中的二进制序列包含任何0x25
字节,则将其转换为%
字符(根据ASCII表)。
然后,此字符在子句中被解释为通配符like
,导致出现许多不需要的结果。
-- A table with a binary column:
DECLARE @foo TABLE(BinCol VARBINARY(MAX));
INSERT INTO @foo (BinCol) VALUES (0x001125), (0x000011), (0x001100), (0x110000);
-- The search key:
DECLARE @key VARBINARY(MAX) = 0x1125; -- 0x25 is '%' in the ASCII table!
-- This returns ALL values from the table, because of the wildcard in the search key:
SELECT * FROM @foo WHERE
CONVERT(VARCHAR(max), BinCol) COLLATE Latin1_General_100_BIN2
LIKE ('%' + CONVERT(VARCHAR(max), @key) + '%');
要解决此问题,请使用以下搜索子句:
-- This returns just the correct value -> 0x001125
SELECT * FROM @foo WHERE
CHARINDEX
(
CONVERT(VARCHAR(max), @key),
CONVERT(VARCHAR(max), BinCol) COLLATE Latin1_General_100_BIN2
) > 0;