强制转换为NVARCHAR(MAX)会导致“中文” / UTF编码字符

时间:2019-12-17 10:30:01

标签: sql-server

我在SELECT语句中使用的代码如下:

CAST(HASHBYTES(N'SHA1', Bla) AS NVARCHAR(MAX)) AS hashed_bla

,最后在ssms网格中以及上游应用程序中都使用“中文” / UTF编码的字符。有办法改变吗?这和整理有关吗?谢谢!

1 个答案:

答案 0 :(得分:2)

您所拥有的正在按预期工作。请看以下示例:

SELECT HASHBYTES('SHA1','B8187F0D-5DBA-4D43-95FC-CD5A009DB98C');

这将返回varbinary0xA04B9CB18A2DC4BC08B83FCCE48A0AF1A1390756。然后,您将该值转换为nvarchar,因此得到N'䮠놜ⶊ별레찿諤㦡嘇'之类的结果(在我的整理中)。对于varbinary,每个4个字符代表一个字符。因此,对于上面的A04B是第一个字符(即N'䮠')。

出现的后面是一个表示varchar值的varbinary(这里不需要nvarchar,因为不会有Unicode字符)。为此,您需要使用CONVERT和样式代码。对于我上面给出的示例,将是:

SELECT CONVERT(varchar(100),HASHBYTES('SHA1','B8187F0D-5DBA-4D43-95FC-CD5A009DB98C'),1);

哪个返回varchar'0xA04B9CB18A2DC4BC08B83FCCE48A0AF1A1390756'。如果您一开始不希望使用'0x',请使用样式代码2,而不要使用1