我正在尝试检查两个数据库之间的数据加载结果。不幸的是,我只能直接访问一个数据库(MySQL),管理MSSQL的公司可以通过API将其公开给我们。
我想做的是检查行集中某些列的一致性。最初,我希望能够对列运行CRC或哈希检查,但似乎没有兼容的方法。
例如,我们可以针对MySQL中的列运行CRC32,但在MSSQL上没有可靠的方法可以做到这一点。或者,MSSQL上有CHECKSUM_AGG,但MySQL上没有其他选项。
最终的结果是,如果校验和不同,我想进行二进制搜索,以识别需要更改的行。
目前没有大容量加载接口,SSIS也不可用(MSSQL服务器不是我公司的一部分)。
我想我会回到这里,描述我们最终实现的解决方案。这是脖子上的一大痛!
首先,由于我们服务器上的MySQL和远程服务器上的MSSQL的固定版本,没有常见的编码方法。MSSQL API以UTF-16LE返回数据,MySQL数据库的Unicode数据存储在Latin-1表中叹息
首先,我们将要比较的字段连接起来,然后对结果进行MD5。为了使MySQL结果与MSSQLHASHYTES函数的输出相匹配,我们必须这样做:
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的和,取三个大素数(311313317)的模
这给了我们三个我们正在检查的范围的数字。我们可以合理地确定,如果每台服务器上给定范围内的三个数字都匹配,那么数据是一致的。
我将省去我们为将拉丁语中的Unicode音译为UTF-16LE