【问题标题】:searching for images in sql by like command通过like命令在sql中搜索图片
【发布时间】:2015-09-12 03:15:06
【问题描述】:

我遇到了关于 SQL 和图像数据类型查询的问题。

我的程序自动将超过 2000 张图像添加到数据库中。不幸的是,其中一些已损坏(灰色图案而不是图像)。我用 SQL Managment Studio 搜索了损坏的图像在其二进制符号的末尾有许多“02020202020202”数据。此数据库中图片内容的类型为“图片”(不能更改)。

如何在整个数据库中搜索具有 02020202 二进制符号的图像?

我试过了

Select * from im__Image where im_Preview LIKE '%02020%';

但它当然没有用。

如何快速获取损坏的图像列表?

【问题讨论】:

  • 试试 stackoverflow.com/questions/948174/… : Select * from im__Image where CAST(im_Preview AS CHAR(10000) CHARACTER SET utf8) LIKE '%02020%';
  • 为什么不能把它从 image 改成 varbinary(max)?我已经多次这样做了,这从来都不是问题。自 2005 年起,图像数据类型已弃用。

标签: sql sql-server image tsql


【解决方案1】:

我认为您还需要在 varbinary 之后转换为 varchar(否则会出现乱码)

给定:

CREATE TABLE  im__Image  (  ImageID     INT IDENTITY PRIMARY KEY
                    ,   im_Preview IMAGE  
                    ,   Added       DATETIME DEFAULT GETDATE()
                    )

还有一些测试数据

insert into im__Image  (im_Preview) values (0x123123211234320202020202020202020220202021231231)
insert into im__Image  (im_Preview) values (0x12312321123432020202020202020202022020202123123102) -- ends with 02, works with 20K+ DataLength()
insert into im__Image  (im_Preview) values (0x1231232112340980984723421231231)

这个查询可以解决嵌入式 0202

select *, convert(varchar(max),CAST(im_Preview as varbinary(max)),2) 
from dbo.im__Image  
where convert(varchar(max),CAST(im_Preview as varbinary(max)),2)  like '%0202%';

这只会返回一张以 02 结尾的图片

select *, convert(varchar(max),CAST(im_Preview as varbinary(max)),2) 
from dbo.im__Image  
where convert(varchar(max),CAST(im_Preview as varbinary(max)),2)  like '%02';

如下图:

(不保证性能......)

【讨论】:

  • 当我使用修改后的查询时 -> like '%02' 它没有让我失望。我已经检查过了,我正在寻找的图片以 020202 结尾......我需要像这样使用,因为有些图片里面有 020202 代码,它是正确的代码......所以我认为这是最好的方法是通过结尾来寻找他们..问题出在哪里?我的查询 select *, convert(varchar(max),CAST(im_Image as varbinary(max)),2) from dbo.im__Image where convert(varchar(max),CAST(im_Image as varbinary(max)),2) like ' %02'
  • 在 SQL 2014 上为我工作,将添加细节来回答
  • 我使用了 SELECT @@VERSION 它显示了我 -> Microsoft SQL Server 2014 - 12.0.4100.1 (X64)
  • 您的查询有错误的字段名称,应该是 im_preview:select *, datalength(im_preview), convert(varchar(max),CAST(im_Preview as varbinary(max)),2) from dbo.im__Image where convert(varchar(max),CAST(im_Preview as varbinary(max)),2) like '%02'
  • 我已将答案更改为使用您的确切列名
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-08
  • 1970-01-01
  • 2012-09-26
  • 2018-12-15
  • 2013-05-02
  • 1970-01-01
相关资源
最近更新 更多