在MySQL中等效于Hashbytes

时间:2018-08-27 03:32:07

标签: mysql sql-server md5 hashbytes

我正在将数据从SQL Server移到MySQL。数据移动没有任何问题,但是我正在尝试提出一种方法来验证SQL Server和MySQL之间的数据完整性。关于数据类型 VARCHAR NVARCHAR ,我遇到了问题。由于它们的范围是 255到MAX 。我正在尝试在这些数据类型之间进行哈希比较,但是它们不匹配。

出于测试目的,我尝试了以下操作:

mysql> SET @test := repeat('t',50000);
Query OK, 0 rows affected (0.00 sec)

mysql> select md5(@test);
+----------------------------------+
| md5(@test)                       |
+----------------------------------+
| a9cf60d59fe2fb94a84bc106eca028be |
+----------------------------------+
1 row in set (0.01 sec)

在SQL Server中尝试相同的操作会带来一些不同:

DECLARE @Test NVARCHAR(MAX) = REPLICATE(CONVERT(NVARCHAR(MAX), N't'), 50000);

SELECT HashBytes('MD5', CONVERT(varchar, @Test));

0x3C48C287BC783516AC89297848A104FE

select LOWER(CONVERT(VARCHAR(32), HashBytes('MD5', CONVERT(varchar, @Test)), 2));

3c48c287bc783516ac89297848a104fe

SELECT CONVERT(VARCHAR(32),HashBytes('MD5', @Test),2);

40752EB301B41EEAEB309348CE9711D6

如您所见,SQL Server中的所有输出均与MySQL不匹配。因此,在这里寻找一些有关如何进行数据比较的指导。

1 个答案:

答案 0 :(得分:0)

作为sql服务器数据库文件数据存储单位的一页只有8KB,而varchar LEN的限制是8000,因此,按照您的测试示例,您将无法获得每页50000个字符的十六进制结果。相反,它是您的@Test示例的结果,该结果是根据8000个字符的字符串长度计算的。