在 Firebird/SQLite 数据库中为字符串创建“校验和”

问题描述 投票:0回答:1

我需要比较 2 个不同数据库中声明为字符串的两列,以及列的所有值,例如一次 10000 行。 一种数据库是 Firebird,一种是 SQLite。我想创建两列的某种校验和,以查看两列中是否有完全相同的值。

对于整数,我可以制作一个

sum(column)
,如果表中的总和匹配,我可以假设它具有相同的值。这不是万无一失的,但是如果记录很多,准确性就会提高。
对于数值,可以使用相同的方法。但是,我不知道如何对字符串列进行类似的操作。

sql sqlite delphi firebird
1个回答
1
投票

我看到了几种可能性。

1。每行比较

最简单的方法是从 Delphi 代码中逐行检查值。它的巨大好处是可以立即找到哪些数据行未同步。

但是如果有从数据库读取整个数据的缺点。

2。 SQL SELECT 中的哈希

如果您想就地进行检查,而不检索数据,那么您需要计算列的哈希值。

Firebird 4 具有 MD5 或 SHA1 等加密哈希函数,您也许能够为旧版 Firebird 版本找到合适的 UDF 库。它们很容易使用 SQLite3 实现,作为自定义聚合函数

确保对列的 UTF-8 文本版本进行哈希处理,因为二进制/原始存储内容与两个数据库不兼容。

然后您可以在两个 SELECT SQL 语句中计算列的哈希值。

3.迭代方法

如果数据被插入到数据库中,而不是被更新,那么您可以在每一行中添加一个“哈希”字段。当插入一行时,您检索最后一个哈希值(为了提高效率,可以将其缓存在内存中),然后对新附加的值进行哈希值。

然后您可以轻松比较最后一行的结果哈希,并检查两个数据库上的数据是否相同。

另一种方法可能是在内存中计算此哈希值,而不是作为数据库中的字段。它只会在启动时检索数据一次,然后在插入某些内容时刷新它。检查两个数据库是否同步可能就足够了。

© www.soinside.com 2019 - 2024. All rights reserved.