1

我正在尝试检查两个数据库之间数据加载的结果。不幸的是,我只能直接访问一个数据库(MySQL),管理 MSSQL 的公司可以通过 API 向我们公开它。

我想做的是检查行集中某些列的一致性。最初,我希望能够对列运行 CRC 或哈希检查,但似乎没有兼容的方式来执行此操作。

例如,我们可以对 MySQL 中的列运行 CRC32,但在 MSSQL 上没有可靠的方法来做同样的事情。或者,在 MSSQL 上有 CHECKSUM_AGG,但在 MySQL 上没有其他选择。

最终结果是,如果校验和不同以识别需要更改的行,我想进行二进制搜索。

目前没有批量加载接口,SSIS 不可用(MSSQL 服务器不属于我的公司)。

4

1 回答 1

3

我想我会回到这个并描述我们最终实施的解决方案。这是脖子上的一大痛!

首先,由于我们服务器上的 MySQL 和远程服务器上的 MSSQL 的固定版本,没有通用的编码方法。MSSQL API 以 UTF-16LE 返回数据,MySQL 数据库将 Unicode 数据存储在 Latin-1 表

首先,我们连接我们正在比较的字段,然后我们对结果进行 MD5 处理。为了使 MySQL 结果与 MSSQL HASHBYTES 函数的输出相匹配,我们必须这样做:

SELECT ABS(CONV(CONCAT(
    IF(MID(MD5(CONC), -8 , 1) >= "8", "FFFFFFFF", ""),
    RIGHT(MD5(CONC), 8)
), 16, -10 )) AS CALC

其中 CONC 是连接我们感兴趣的字段的子选择的结果。

在 MSSQL 服务器上,我们必须执行以下查询:

SELECT ABS(CONVERT(INT,HASHBYTES('MD5',
    CONVERT(NVARCHAR(4000), FIELD1 ) + 
    CONVERT(NVARCHAR(4000), FIELD2 ) + ...

然后,根据中国剩余定理,我们对整个范围内的 MD5 求和,以三个大素数 (311,313,317) 为模

这为我们检查的范围提供了三个数字。我们可以合理地确定,如果所有三个数字都匹配每个服务器上的给定范围,那么数据是一致的。

我将为您省去将拉丁语 1 中的 Unicode 音译为 UTF-16LE 所必须进行的处理的详细信息

于 2013-08-06T16:53:01.873 回答