我们使用Azure数据流在Azure SQL数据仓库中生成数据表的历史记录。在数据流中,我们在所有列上使用md5或sha1函数来生成唯一的行指纹,以检测记录中的更改,或识别已删除/新的记录(相当标准的历史记录技术)。
对于某些数据表,我们有包含十进制值的列(例如,数据类型DECIMAL(18,1) )。如果我看一下在一个整数,一个文本和一个十进制列上生成的md5散列,我会期望这三行在Azure数据流中生成不同的散列:

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

这导致我们的一些历史表不能保持数据的准确记录,只有小数列中的值发生了变化。
我的问题是:有没有人知道这是Azure数据流的“设计”,还是这是一个需要微软修复的bug?
发布于 2020-12-23 21:43:32
是的,这是设计出来的,同时也是一个bug。
我也面临着这个问题,我和团队想出了和你一样的变通方法,但执行时间翻了一番。
在对微软进行了大约一个小时的讨论后,我们发现:
指定精度和小数位数的浮点数不受affected
对于这些值,MD5将返回相同的值:
下面的值具有相同的行为:
对于以下内容,将返回不同的哈希:
有人告诉我,预计2月份会有修复。
如果不使用像me (byNames)这样的列函数,您可以将值乘以以10为底的幂,并将小数作为指数。
这将比toString更快。
https://stackoverflow.com/questions/64575556
复制相似问题