我们想要获取整个表的md5校验和来验证数据的一致性,例如使用 SQL Server 的
hashbytes()
功能。
作为概念验证的中间步骤,我们找到了一种将所有列连接成一个文本字符串的方法,这样我们就可以获得表中每一行的 md5 校验和。请参阅以下示例 SQL 作为示例。
select
hashbytes('md5',
''
+ col_1
+ col_2
...
+ col_n
+ char(0)+char(0)+char(13)+char(10)
)
from the_table
;
但是,我们想知道如何获取整个表的md5校验和。
理想情况下,我们希望在输入源文本文件上运行
md5sum
,并希望与导入的数据库表中的 md5 校验和相匹配。
我们非常感谢任何提示和建议。
虽然我同意@JoelCoehoorn的评论,但是可以通过某些方式回答表的特定md5哈希值。
请注意,即使您获得表的 md5,您也需要考虑 NULL、空字符串、空格、nvarchar 与 varchar、FLOATS 的不同样式、数字等。还要注意,文件通常有换行符和列分隔符,这当然会被转换为数据库中的行。
创建 md5 的一种简单方法是通过 FOR JSON 中介来完成:
select HASHBYTES('md5', (
select *
from sys.objects
order by object_id
for json path, include_null_values)
)
请注意,这会创建 jsonfied 表内容的 USC-2 字符串,当涉及 HASHBYTES 时,该字符串与纯 ASCII 或 UTF8/16 具有不同的特征。因此,当您创建文件时,您需要在创建 json 内容时使用相同的技术。
您还可以尝试通过执行以下操作来模仿文件内容本身:
select HASHBYTES('md5', (
select CONCAT(name, CHAR(9), object_id, CHAR(9), schema_id, CHAR(10))
from sys.objects
order by object_id for xml path(''),type).value('text()[1]','NVARCHAR(MAX)')
)
这将创建一个制表符分隔的“文件”字符串 作为行分隔符,然后进行 MD5 处理。在这里,我使用 FOR XML“技巧”,它允许轻松地从表创建文本 blob。请注意,您需要通过执行 CONCAT 函数调用来手动构建“列”。
所以,是的,虽然技术上可行,但内容匹配存在很多挑战。通常,最好进行某种手动哈希,比较行数、SUM 等一些关键指标,以确保您导入的内容与您首先想要导入的内容相匹配