【问题标题】:hashbytes equivalent in mysql when working with none english text使用非英文文本时在 mysql 中等效的哈希字节
【发布时间】:2020-05-14 14:53:45
【问题描述】:

当我使用非英文字符时,生成的哈希值不一样,但除此之外,一切都很好。 有没有人有解决方案来获得相同的结果?

MYSQL

  SELECT  MD5( 'سلام')
------------- result: 78903c575b0dda53c4a7644a2dd36d0e

SQL 服务器

SELECT CONVERT(VARCHAR(50), HASHBYTES('MD5',  'سلام'), 2) 
-------------- result:3C50F6458899B3C0988BE358290F5F24


SELECT CONVERT(nVARCHAR(50), HASHBYTES('MD5',  N'سلام'), 2) 
-------------- result:0381CA5081FBC68B2F55F2F2C21399D7

【问题讨论】:

  • 我认为您的部分问题是找出 MySQL 使用的字符编码,以便您可以在 SQL Server 上使用相同的编码。在 MySQL 上,如果你 SELECT HEX(CAST('سلام' as binary)),你会得到 D8B3D984D8A7D985。现在在 SQL Server 上,如果您执行 declare @blob varbinary(8) = 0xD8B3D984D8A7D985; select hashbytes('md5', @blob);,您将获得与您期望的相同的哈希值,0x78903C575B0DDA53C4A7644A2DD36D0E
  • 是的,这是一种方法,但我无法弄清楚。

标签: mysql sql-server md5 farsi hashbytes


【解决方案1】:

根据 MySQL 从 SELECT HEX(CAST('سلام' as binary)) 返回的 D8B3D984D8A7D985,看来 MySQL 正在使用 UTF-8 字符编码。

在 SQL Server 2019 上,您可以使用 LATIN1_GENERAL_100_CI_AS_SC_UTF8 排序规则(SQL Server 2017 不支持),如下所示:

create table #Test (
  UTF16 nvarchar(max),
  UTF8 varchar(max)  COLLATE LATIN1_GENERAL_100_CI_AS_SC_UTF8
)
insert #Test values (N'سلام', N'سلام');

select UTF16 from #Test;
select CAST(UTF16 as varbinary) as [UTF16-Bytes] from #Test;
select UTF8 from #Test;
select CAST(UTF8 as varbinary) as [UTF8-Bytes] from #Test;

返回:

UTF16
سلام

UTF16-Bytes
0x3306440627064506

UTF8
سلام

UTF8-Bytes
0xD8B3D984D8A7D985

然后用 hashbytes():

select hashbytes('MD5', cast(UTF16 as varbinary)) as [UTF16-Hash] from #Test;
select hashbytes('MD5', cast(UTF8 as varbinary)) as [UTF8-Hash] from #Test;

返回:

UTF16-Hash
0x0381CA5081FBC68B2F55F2F2C21399D7

UTF8-Hash
0x78903C575B0DDA53C4A7644A2DD36D0E

希望这会有所帮助!

【讨论】:

  • ``` SELECT CONVERT(VARCHAR(50), HASHBYTES('MD5', CAST(N'سلام' COLLATE LATIN1_GENERAL_100_CI_AS_SC_UTF8 AS VARCHAR(max)) ), 2) ``` 如果你想转换而不是更改表的排序规则
猜你喜欢
  • 2019-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-06
  • 2015-10-01
  • 2012-01-08
相关资源
最近更新 更多