2

我们使用 Azure 数据流在 Azure SQL 数据仓库中生成数据表的历史记录。在数据流中,我们在所有列上使用 md5 或 sha1 函数来生成唯一的行指纹以检测记录的变化,或识别已删除/新的记录(相当标准的历史技术)。

对于某些数据表,我们有包含十进制值的列(例如数据类型 DECIMAL(18,1))。如果我查看在一个整数、一个文本和一个十进制列上生成的 md5 哈希,我希望这三行在 Azure 数据流中生成不同的哈希: 在此处输入图像描述

但是,这三行得到完全相同的哈希,这意味着我们无法检测到 [id] = 1 的记录的字段 [value] 的变化。如果十进制值作为文本存储在数据库中 (或在 md5 函数中转换为字符串),哈希值不同:

在此处输入图像描述

这导致我们的一些历史表没有准确记录数据,其中只有小数列中的值发生了变化。

我的问题:有人知道这是否是 Azure 数据流的“设计”,还是需要由 Microsoft 修复的错误?

4

1 回答 1

0

是的,这是设计使然,同时它也是一个错误。

我也遇到过,我和这里的团队想出了与您相同的解决方法,但执行时间增加了一倍。

在对微软进行了大约 1 小时的讨论后,我们发现:

  • 浮动不受影响
  • 指定精度和小数位数的数据类型会受到影响
  • md5 的行为,最后一个是,将其四舍五入 Integer 并在其上应用 md5。

MD5 将为这些值返回相同的值:

  • 0
  • 0.1
  • 0.4

以下值的相同行为:

  • 0.5
  • 0.6
  • 1

将返回不同的哈希值:

  • 0.4
  • 0.9
  • 1.5
  • 2.5

我被告知修复预计在 2 月进行。

如果不使用像我这样的列函数(byNames),您可以将您的值乘以以 10 为底的幂,并以比例为指数。

这将比 toString 更快。

于 2020-12-23T13:43:32.483 回答