我需要比较 2 个不同数据库中声明为字符串的两列,以及列的所有值,例如一次 10000 行。 一种数据库是 Firebird,一种是 SQLite。我想创建两列的某种校验和,以查看两列中是否有完全相同的值。
对于整数,我可以制作一个
sum(column)
,如果表中的总和匹配,我可以假设它具有相同的值。这不是万无一失的,但是如果记录很多,准确性就会提高。我看到了几种可能性。
1。每行比较
最简单的方法是从 Delphi 代码中逐行检查值。它的巨大好处是可以立即找到哪些数据行未同步。
但是如果有从数据库读取整个数据的缺点。
2。 SQL SELECT 中的哈希
如果您想就地进行检查,而不检索数据,那么您需要计算列的哈希值。
Firebird 4 具有 MD5 或 SHA1 等加密哈希函数,您也许能够为旧版 Firebird 版本找到合适的 UDF 库。它们很容易使用 SQLite3 实现,作为自定义聚合函数。
确保对列的 UTF-8 文本版本进行哈希处理,因为二进制/原始存储内容与两个数据库不兼容。
然后您可以在两个 SELECT SQL 语句中计算列的哈希值。
3.迭代方法
如果数据被插入到数据库中,而不是被更新,那么您可以在每一行中添加一个“哈希”字段。当插入一行时,您检索最后一个哈希值(为了提高效率,可以将其缓存在内存中),然后对新附加的值进行哈希值。
然后您可以轻松比较最后一行的结果哈希,并检查两个数据库上的数据是否相同。
另一种方法可能是在内存中计算此哈希值,而不是作为数据库中的字段。它只会在启动时检索数据一次,然后在插入某些内容时刷新它。检查两个数据库是否同步可能就足够了。