【发布时间】:2020-03-02 19:17:06
【问题描述】:
我正在将数据从 SQL Server 2017 迁移到 Postgres 10.5。
为了比较数据的一致性,我想对表中的行进行哈希处理。
这是我的方法。
我将对 SQL 服务器表和 Postgres 表发出查询,并获取所有行的哈希列表。我将有两个哈希列表。
- SQL Server 表哈希列表
- Postgres 表哈希列表
我可以比较它们并检查数据是否一致。
我在 Postgres 中找到了一个对表中的行执行散列的函数。
select md5(f::text) from table_name as f
它正在返回表中所有行的哈希值,如下所示。
hash1_for_row1
hash2_for_row2
hash3_for_row3
hash4_for_row4
....
但我在 SQL Server 中找不到等效函数或其他东西来执行相同的 MD5 哈希。
我在 SQL Server 2017 中查看了HASHBYTES() https://docs.microsoft.com/en-us/sql/t-sql/functions/hashbytes-transact-sql?view=sql-server-ver15
但它只对一列进行哈希处理。在varchar() 的列上也是如此。
如何对表中的所有行和所有列执行HASHBYTES() 函数,而不是只对上面提到的返回哈希的一列执行?
【问题讨论】:
-
如果您能说明您在应用程序过程中如何使用 SQL Server 中的整个表哈希,这也可能会有所帮助。
-
更新了问题。顺便说一句,我正在寻找每一行的
hash。整张桌子都没有hash。 -
SQL Server 中
MD5的等价物是HASHBYTES,然而,您不应该再使用 MD5,因为它们不是真正的哈希值(因为它们可以反转)。从链接的文档:“从 SQL Server 2016 (13.x) 开始,不推荐使用 MD2、MD4、MD5、SHA 和 SHA1 算法。改用 SHA2_256 或 SHA2_512。旧算法将继续工作,但它们会引发弃用事件。” -
在
Postgres中,我尝试使用此处提到的digest()函数postgresql.cn/docs/9.5/pgcrypto.html 但我收到了错误,尽管我已经安装了pgcrypto扩展。
标签: sql-server postgresql md5 database-migration