Sql 在表中存储唯一图像
我继承了一个数据库,其中包含.png图像,这些图像已被转换为Sql 在表中存储唯一图像,sql,sql-server,Sql,Sql Server,我继承了一个数据库,其中包含.png图像,这些图像已被转换为byte[],最后被转换为ToBase64String,并保存在一个包含许多重复图像的表中。我想清理它,创建一个具有唯一映像的新表,但原始表没有与映像相关的主键。我提出了以下想法,但希望得到一些关于可行性的反馈或更好的建议 i) 创建包含2列的新表 PrimaryKey varchar(64) ImageBinary varbinary(MAX) ii)将Base64String转换回图像字节[],并以ImageBinary varb
byte[]
,最后被转换为ToBase64String
,并保存在一个包含许多重复图像的表中。我想清理它,创建一个具有唯一映像的新表,但原始表没有与映像相关的主键。我提出了以下想法,但希望得到一些关于可行性的反馈或更好的建议
i) 创建包含2列的新表
PrimaryKey varchar(64)
ImageBinary varbinary(MAX)
ii)将Base64String转换回图像字节[],并以ImageBinary varbinary(MAX)
iii)使用HASHBYTES('SHA2_256',ImageBinary)对图像进行散列,并以PrimaryKey varchar(64)
iv)将对任何新图像进行散列,并与现有主键散列进行比较
当前统计数据约为
- 以db表示的图像约200000
- DB70000中的唯一图像
- 未来可能的唯一图像(以100万分贝为单位)
- SQL中TOBASE64字符串的当前数据字符长度最小值:2900最大值:170000
看一看,这样您就可以通过数据库访问图像,但它存储在数据库之外。否则,进行数据库备份将成为一个问题 请查看来自Red Gate的filestream教程:
MD5的示例:
SET IMG_MD5 = LOWER(SUBSTRING(master.dbo.fn_varbintohexstr(HashBytes('MD5', FIELD_NAME)), 3, 32) )
,IMG_SHA1 = sys.fn_varbintohexsubstring(0, HashBytes('SHA1', FIELD_NAME), 1, 0)
SHA256将更快,尤其是对于更大的文件-块越大,速度越快algorithm@PanagiotisKanavos:是的,但是sha512是64字节,sha256是32字节的散列大小。如果我有一百万张图片,我会优化散列大小,而不是速度,特别是如果速度差不大的话。此外,根据automationrhapsody,Sha256和SH512速度较慢。我还将测试SQL server中的具体实现,看看哪一个最快。块大小越大,算法越快,因此MD5比SHA1慢,SHA1比SH256慢。如果将图像存储在数据库中,则无论如何都不能使用数据库未提供的任何算法,因此不能使用任何非加密哈希。您使用的是哪个版本?SQL Server 2017增加了对Python的支持,这意味着您可以使用Python包进行哈希或图像比较——事实上,添加Python是为了支持此类ML场景。使用它作为通用扩展机制是bonusIt在服务器上的SQL server 2016,它与C#集成,我可以根据不同的编码在SQL/C#之间复制散列。SQL server 2016提供了R,它还提供了用于散列和ML的包。SQLCLR本质上是.NET 3.5+或.NET 4-:它不理解任务或NuGet。我怀疑在R中找到CityHash或MurrudHash实现要比C#Check更容易。它支持许多散列算法,但SQLCLR对NuGet一无所知。您必须创建自己的SQLCLR项目,添加NuGet包,并希望没有不兼容