【问题标题】:MD5 for float8 datatype differs between Redshift and Postgres用于 float8 数据类型的 MD5 在 Redshift 和 Postgres 之间有所不同
【发布时间】:2021-03-03 15:05:19
【问题描述】:

我将数据从 Postgres 迁移到 Redshift 并进行数据验证检查,因此将 MD5 用于完整行。 Postgres 到 Redshift 之间的视觉检查是可以的,但 Float8 数据类型的 MD5 值不同。

在 Postgres 中:

balance|md5(balance::VARCHAR)
-140.2|d59f47f21a88e8b73d4ca309d75cc64b

在红移中:

balance|md5(balance::VARCHAR)
-140.2|539dc58d834b1cf24252705b4f40b7f1

有人遇到这个问题吗?关于为什么会有这种差异的任何想法?迁移后是否有其他方法可以对跨数据库的所有行进行数据验证?

【问题讨论】:

  • numeric 列上使用md5() 是否也会显示此行为?如果不是,那么它可能是由于 float 是一个 近似 数据类型,并且 Redshift 和 Postgres 之间的实现在某种程度上有所不同(尽管亚马逊在他们的营销资料中声明,Redshift 不是 和 Postgres 一样)
  • 数字很好。仅与浮点值有关。
  • 对迁移的数据进行行级数据验证有什么想法吗?
  • 两个值都不对应md5('-140.2'),因此您可能需要单独检查balance::VARCHAR
  • 我无法重现。也许你可以想出一个完整的可重现的测试用例。

标签: sql postgresql amazon-redshift md5 data-migration


【解决方案1】:

Redshift MD5() 对字符串进行操作,因此这些浮点数需要转换为字符串。假设您在两个数据库中确实具有完全相同的值,可能的原因是来自这些隐式转换的字符串表示不同。您将需要使用 to_char() 函数来控制浮点数如何表示为字符串。

【讨论】:

    猜你喜欢
    • 2015-08-20
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    • 2015-11-08
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    相关资源
    最近更新 更多