如何在image / varbinary字段中搜索以二进制模式开头的记录

时间:2011-08-01 16:37:11

标签: sql image sql-server-2005 search magic-numbers

我正在尝试查找所有不以magic number ff d8 ff e0开头的图片(jpg的签名)根据MSDN我应该可以在我的数据上使用patindex 。但是

SELECT TOP 1000 [cpclid]
FROM [cp]
where patindex('FFD8FFE0%', cpphoto) = 0 -- cpphoto is a column type of image

给我错误

  

Msg 8116,Level 16,State 1,Line 1   对于patindex函数的参数2,参数数据类型图像无效。

查找与ff d8 ff e0的幻数不匹配的记录的正确方法是什么?

更新

Here is a link来测试您的任何建议。


我罗斯的解决方案最终会对查询进行一些调整。

SELECT [cpclid]
  FROM [cp]
where convert(varchar(max), cast(cpphoto as varbinary(max))) not like convert(varchar(max), 0xFFD8FFE0 ) + '%'


我找到了更好的解决方案,请参阅我的回答。

3 个答案:

答案 0 :(得分:6)

为什么还在使用IMAGE数据类型?它已被弃用,支持VARBINARY(MAX)...如果你将列转换为VARBINARY(MAX),我认为你会发现它更容易使用。

修改

在SQL Server 2008中,您可以使用更容易的转换:

SELECT CONVERT(VARCHAR(MAX), CONVERT(VARBINARY(MAX), cpphoto), 2) FROM cpphoto;

实际上这对你的StackExchange查询工作得很好(我怀疑后端没有使用SQL Server 2005)。

但我很高兴我的答案对你来说是无用的。注意自己。

答案 1 :(得分:6)

我找到了一个更简单的解决方案,运行速度更快。

SELECT [cpclid] 
FROM [cp]
where cast(cpphoto as varbinary(4)) <> 0xFFD8FFE0

答案 2 :(得分:2)

where 子句中使用where cpphoto not like 'FFD8FFE0%'

施放 cpphoto,如果它不是字符串,则为varchar(max)