SQL Server中如何比较varchar与varbinary?实现图片格式匹配
图片格式匹配查询方案
先明确两张表的结构(你可以根据实际表名/字段名替换):
- 图片格式表(示例名
ImageFormats):FormatName(存'jpg'/'png'这类格式名)、Signature(存格式对应的文件头十六进制字符串) - 图片表(示例名
Images):ImageData字段,类型为image
实现逻辑
每种图片格式都有固定的文件头字节序列(也就是签名),我们只需要把image字段的开头字节转成十六进制字符串,再和格式表的签名做匹配就行。另外要注意,优先匹配更长的签名——比如如果有个格式签名是FFD8,要先匹配FFD8FFD8(jpg的完整签名),避免误判。
最终查询语句
SELECT i.*, ISNULL(f.FormatName, 'Unknown') AS ImageType FROM Images i LEFT JOIN ImageFormats f ON CONVERT(VARCHAR(MAX), i.ImageData, 2) LIKE f.Signature + '%' ORDER BY LEN(f.Signature) DESC;
语句细节说明
CONVERT(VARCHAR(MAX), i.ImageData, 2):把image类型的二进制数据转成不带0x前缀的十六进制字符串LIKE f.Signature + '%':判断图片的开头字节是否和格式签名完全一致ORDER BY LEN(f.Signature) DESC:让长签名的匹配结果排在前面,确保优先匹配更精准的格式ISNULL(f.FormatName, 'Unknown'):如果没有匹配到任何已知格式,返回Unknown
额外提示
如果你的格式表中签名是带0x前缀的(比如0xFFD8FFD8),就把转换语句改成CONVERT(VARCHAR(MAX), i.ImageData, 1)(这个会生成带0x前缀的十六进制字符串),再执行匹配即可。
内容的提问来源于stack exchange,提问作者Ivan Debono
相关产品推荐
相关产品推荐

