【问题标题】:What is the Postgres MD5() equivalent in SQL Servrer?SQL Server 中的 Postgres MD5() 等效项是什么?
【发布时间】:2020-03-02 19:17:06
【问题描述】:

我正在将数据从 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://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


【解决方案1】:

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

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

MS 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 查询中将表名传递到哪里来获取哈希值。
  • @Sukumar 将查询的前两行替换为:“WITH p AS (SELECT * FROM your_table)”。对于 SQL Server 版本,您还需要将 WHERE 子句中的“ky”替换为表中键列的名称。
猜你喜欢
  • 2010-11-19
  • 1970-01-01
  • 2019-09-01
  • 2011-06-26
  • 2011-04-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-30
  • 2013-07-23
相关资源
最近更新 更多