Sql server 如何在SQL Server varbinary(max)字段中搜索字节序列?
我正在尝试在SQL Server 2012上编写一个查询,该查询将返回包含指定字节序列的varbinary(max)列。我可以通过一个将varbinary字段转换为varchar的查询来实现这一点,并使用如下方法:Sql server 如何在SQL Server varbinary(max)字段中搜索字节序列?,sql-server,varbinarymax,Sql Server,Varbinarymax,我正在尝试在SQL Server 2012上编写一个查询,该查询将返回包含指定字节序列的varbinary(max)列。我可以通过一个将varbinary字段转换为varchar的查询来实现这一点,并使用如下方法: SELECT * FROM foo WHERE CONVERT(varchar(max), myvarbincolumn) LIKE '%' + CONVERT(varchar(max), 0x626C6168) + '%' 其中“0x626C6168”是我的目标字节序列。不
SELECT * FROM foo
WHERE CONVERT(varchar(max), myvarbincolumn) LIKE
'%' + CONVERT(varchar(max), 0x626C6168) + '%'
其中“0x626C6168”是我的目标字节序列。不幸的是,只有当字段不包含任何值为零(0x00)的字节并且这些字节在我的数据中非常常见时,这种方法才有效。是否有一种不同的方法可以处理包含零值字节的值?如果使用二进制排序规则,它应该可以工作
WITH foo(myvarbincolumn) AS
(
SELECT 0x00626C616800
)
SELECT *
FROM foo
WHERE CONVERT(VARCHAR(max), myvarbincolumn) COLLATE Latin1_General_100_BIN2
LIKE '%' + CONVERT(VARCHAR(max), 0x626C6168) + '%'
如果使用的是较旧版本的SQL Server,您可能需要(比如)Latin1\u General\u BIN。不幸的是,Martin提出的解决方案存在缺陷 如果搜索键中的二进制序列包含任何
0x25
字节,它将被转换为%
字符(根据表)
然后,此字符在like
子句中被解释为a,导致出现许多不需要的结果
-- 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;
我刚刚发现了这个非常简单的问题
SELECT * FROM foo
WHERE CONVERT(varchar(max), myvarbincolumn,2) LIKE '%626C6168%'