如何将两个不同数据库(MySQL、SQL SERVER)之间的 TEXT 字段与哈希值进行比较?

Posted

技术标签:

【中文标题】如何将两个不同数据库(MySQL、SQL SERVER)之间的 TEXT 字段与哈希值进行比较?【英文标题】:How do I compare a TEXT field between two different databases (MySQL, SQL SERVER) with a hash? 【发布时间】:2021-10-15 23:36:19 【问题描述】:

我正在尝试快速比较两个独立应用程序中的大数据(一个在 mysql 上,另一个在 SQL SERVER 上)。

myData 字段在两个数据库中都是一个TEXT 字段,我想看看这个字段的值是否在它们之间发生了变化(myData 可以是数十万或数百万个字符)

在 MySQL 中:

select sha1(myData) from myTable where mypk=1;

在 SQL 服务器中:

select right(convert([varchar](45), hashbytes('SHA1', cast(myData as nvarchar(max))), 1),40) from myTable where mypk=1;

我的哈希输出与两个数据库中相同的 TEXT 字段值不匹配。我怎样才能让它这样做?

这是我迄今为止的假设:

    MySQL 将对 TEXT 进行哈希处理,但 SQL-SERVER 不会(因此转换为 nvarchar)。 MySQL 不允许转换为 nvarchar。 如果哈希的输入类型不同,输出也会不同(在我的例子中,一个是 TEXT,另一个是 nvarchar)。

此外,如果使用 DB2 或 Oracle 代替 SQL Server 会怎样?是否有一些简单的方法来解决这个问题(对不起,如果这部分 q 太模糊)?

【问题讨论】:

我也不反对将算法 (SHA1) 切换到其他任何东西 - 我只是想确保我的输出与原始 TEXT 字段相比更短 至少您应该始终对二进制值进行哈希处理,以确保文本编码的差异不会改变哈希值。即使如此,我也不确定您是否会从不同平台获得相同的哈希值。您可能只需要比较长度+前缀,如果匹配,则在客户端上执行完整比较。 感谢@DavidBrowne-Microsoft 的提示。我已经比较了两个固定字符串的 SHA1 值(即 SHA1(“我的示例字符串”)等),发现它们产生相同的输出 - 所以我希望我的问题在于不同数据类型 它可能,特别是如果字符串都是 ASCII 字符。您可以尝试varchar(max) 而不是nvarchar(max),因为您的专栏是text 而不是ntext。此外,您不应再在 SQL Server 中使用text 不。 max 表示 varchar(max) 的最大长度为 2^31-1 个字节。 docs.microsoft.com/en-us/sql/t-sql/data-types/… 【参考方案1】:

SQL Server text 是一种已弃用的类型,已被 varchar(max) 取代,用于存储编码的非 unicode 长字符串。因此,'varchar(max)' 比 'nvarchar(max)' 更可能与 MySql 文本二进制兼容,后者每个字符使用两个字节。

【讨论】:

用 varchar(max) 替换它效果很好。谢谢大卫

以上是关于如何将两个不同数据库(MySQL、SQL SERVER)之间的 TEXT 字段与哈希值进行比较?的主要内容,如果未能解决你的问题,请参考以下文章

sql数据库中,如何将一个表中的多列数字合并为一列

如何使用 insert 语句将数百万不同 RDBMS 的数据插入 SQL Server 数据库?

MySQL中如何合并结构和记录数都不同的两个表?

Oracle Sql 如何将两个字段拼接到一块

MySQL学习记录

SQL语句报错:You have an error in your SQL syntax; check the manual that corresponds to your MariaDB serv