如何将两个不同数据库(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 字段与哈希值进行比较?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 insert 语句将数百万不同 RDBMS 的数据插入 SQL Server 数据库?
SQL语句报错:You have an error in your SQL syntax; check the manual that corresponds to your MariaDB serv