gpt4 book ai didi

sql-server - SQL Server 中的 Postgres MD5() 等效项是什么?

转载 作者:行者123 更新时间:2023-11-29 13:07:58 28 4
gpt4 key购买 nike

我正在将数据从 SQL Server 2017 迁移到 Postgres 10.5

为了比较数据的一致性,我想对表中的行进行哈希。

这是我的方法。

我将对 SQL 服务器表和 Postgres 表发出查询,并获取所有行的哈希值列表。我将有两个哈希列表。

  1. SQL Server 表哈希列表
  2. 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://learn.microsoft.com/en-us/sql/t-sql/functions/hashbytes-transact-sql?view=sql-server-ver15

但它只对一列进行哈希处理。在 varchar() 的列上也是如此。

如何对表中的所有行和所有列执行 HASHBYTES() 函数,而不是像上面提到的那样只对一列返回哈希值?

最佳答案

MSSQL 中的 HASHBYTES('MD5',x) 等同于 Postgres 中的 MD5(x)。这两个函数都只接受一个值作为输入。

您真正要问的是如何复制::text 的行为,它将整个表转换为文本值数组。一个问题是在 Postgres 中将一行转换为文本的输出对于 Postgres 来说是非常特殊的。格式规则可能难以在另一个平台上准确复制,例如,引用中的任何更改都会导致不同的哈希值。更好的选择可能是将您的数据转换为更标准的格式,如 JSON,然后对该结果进行哈希处理。例如:

微软 SQL:

WITH p (ky,val) AS
(SELECT 1,'foo' UNION ALL SELECT 2,'bar')
SELECT j, HASHBYTES('MD5',CAST(j AS VARCHAR(MAX))) AS md5
FROM p AS p1
CROSS APPLY (SELECT * FROM p WHERE p.ky=p1.ky FOR JSON AUTO, WITHOUT_ARRAY_WRAPPER) AS t(j);

{"ky":1,"val":"foo"} 84C700DA7093081E7A800D1790BE09CE
{"ky":2,"val":"bar"} A364B3F954F1A875540FE361CABFFD2A

PostgreSQL:

WITH p (ky,val) AS
(SELECT 1,'foo' UNION ALL SELECT 2,'bar'),
p1 AS
(SELECT row_to_json(p) as j
FROM p)
SELECT j,md5(j::text) as md5 from p1;

{"ky":1,"val":"foo"} 84c700da7093081e7a800d1790be09ce
{"ky":2,"val":"bar"} a364b3f954f1a875540fe361cabffd2a

关于sql-server - SQL Server 中的 Postgres MD5() 等效项是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58727886/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com