使用SQL Server 2014我有,有一个表nvarchar(max)称为列[ASCII File]其中可以包含很多K的ASCII文本文件,然后我想这样做对文件和结果哈希应该永远是20个字节的MD5 HASHBYTES.
好吧,当我做一个选择hashbytes('MD5', [ASCII File])我得到查询完成错误
消息8152,级别16,状态10,行4
字符串或二进制数据将被截断.
我尝试时收到同样的信息
left(hashbytes('MD5', [ASCII File]), 50)
Run Code Online (Sandbox Code Playgroud)
我尝试时收到同样的信息
convert(varchar(50), hashbytes('MD5', [ASCII File]))
Run Code Online (Sandbox Code Playgroud)
似乎自从我正在进行哈希字节的列时,哈希nvarchar(max)字节函数的结果也是如此nvarchar(max).
你能告诉我如何才能让结果成为预期的20长,而不是这么长时间它必须被截断吗?
我有一个复杂的查询,它使用大量的二进制校验和函数,当我用两个不同记录的一些测试数据对其进行测试时,实际上返回了相同的校验和值。请在下面找到我使用的测试数据
SELECT BINARY_CHECKSUM(16 ,'EP30461105',1) AS BinaryCheckSumEx UNION ALL
SELECT BINARY_CHECKSUM(21 ,'EP30461155',1) AS BinaryCheckSumEx
Run Code Online (Sandbox Code Playgroud)
现在,我正在尝试将HASHBYTES函数与“ MD5”算法一起使用,可以肯定地为其获取唯一记录,但是现在让我担心的是,在当前查询中,我使用“校验和”值来加入“合并”语句寻找新记录。由于“ HashBytes”返回我Varbinary数据类型,所以当我用“ HashByte”字段替换联接条件时,可以期望多少性能开销。
SELECT HASHBYTES('MD5', CONCAT(Col1,Col2,Col3,Col4,..))
Run Code Online (Sandbox Code Playgroud)
而且,我需要为多个列创建哈希,在这种情况下,我需要具有一个额外的Concat函数,这会对我的性能产生额外的开销。
我正在使用 SHA256 来获取散列的十六进制字符串。使用常规字符时它工作得很好,但是当要散列的字符串包含重音符号/变音符号时,我在 C# 和 T-SQL 中会得到不同的结果。我更愿意在 SQL Server 端进行更改。
\n\nC#
\n\nusing (SHA256 sha2 = SHA256.Create()) \n{\n var hash = sha2.ComputeHash(Encoding.UTF8.GetBytes(fullAddress));\n string hexString = string.Empty;\n\n for (int i = 0; i < hash.Length; i++)\n {\n hexString += hash[i].ToString("X2"); //Convert the byte to Hexadecimal representation, Notice that we use "X2" instead of "X"\n }\n\n sha2.Dispose();\n return hexString;\n}\nRun Code Online (Sandbox Code Playgroud)\n\nSQL
\n\ndeclare @fullAddress nvarchar(500)\nset @fullAddress = \'MU\xc3\x91OZ\'\nselect CONVERT([varchar](256), HASHBYTES(\'SHA2_256\', @fullAddress), 2) \nRun Code Online (Sandbox Code Playgroud)\n 我们的旧 sql 遗留代码之一,使用 HASHBYTES 函数和 sha2_256 转换 sql 中的数字列。
整个过程正在转移到 python,因为我们在遗留工作之上加入了一些高级用法。但是,在使用连接器时,我们调用了相同的 sql 代码,即 HASHBYTES('sha2_256',column_name) id 返回带有大量垃圾的值。
在 sql 中运行代码导致此
Column Encoded_Column
101286297 0x7AC82B2779116F40A8CEA0D85BE4AA02AF7F813B5383BAC60D5E71B7BDB9F705
Run Code Online (Sandbox Code Playgroud)
从 python 运行相同的 sql 查询结果
Column Encoded_Column
101286297
Run Code Online (Sandbox Code Playgroud)
b"z\xc8+'y\x11o@\xa8\xce\xa0\xd8[\xe4\xaa\x02\xaf\x7f\x81;S\x83\xba\xc6\r^q\xb7\xbd\xb9\ xf7\x05"
代码是
Select Column,HASHBYTES('SHA2_256', CONVERT(VARBINARY(8),Column)) as Encoded_Column from table
Run Code Online (Sandbox Code Playgroud)
我尝试过通常的垃圾清除,但没有帮助
我编写了一个存储过程来散列某个列的值.我需要在CASE WHEN或IIF语句中使用此HASHBYTES函数,如下所示:
DECLARE @Hash varchar(255) = 'testvalue'
SELECT IIF(1=1, HASHBYTES('SHA1',@Hash), @Hash)
SELECT CASE WHEN 1=1 THEN HASHBYTES('SHA1',@Hash) END AS Hashcolumn
Run Code Online (Sandbox Code Playgroud)
我无法理解为什么我从上面的查询得到不同的输出?似乎每当我在CASE WHEN/IIF语句中添加一个ELSE时,它都会返回一串奇怪的字符(ü<þ+OUL'RDOk{\Ìø如上例所示).
谁能告诉我为什么会这样?我需要使用CASE WHEN或IIF.
多谢你们
我正在散列相同的值,但得到不同的结果。
这是一个简单的示例来解释我遇到的情况:
我有一个如下所示的维度表:
| 性别 | 性别_id |
|---|---|
| 男性 | 1 |
| 女性 | 0 |
性别的数据类型是 NVARCHAR(6),gender_id 是 INT
当我执行以下任何查询时,我得到相同的哈希值:
**Scenario 1:**
SELECT
CONVERT(BINARY(20), HASHBYTES('Md5', Concat(Gender, cast(gender_id as int))))
FROM demographic
WHERE gender = 'Male';
Run Code Online (Sandbox Code Playgroud)
输出:'0x6B216D8BB993AA263265CCF645C282B100000000'
**Scenario 2:**
SELECT
CONVERT(BINARY(20), HASHBYTES('Md5', Concat(Gender, CAST(gender_id AS NVARCHAR(1)))))
FROM demographic
WHERE gender = 'Male';
Run Code Online (Sandbox Code Playgroud)
输出:'0x6B216D8BB993AA263265CCF645C282B100000000'
在场景1中,我将gender_id转换为INT,在场景2中我将gender_id转换为NVARCHAR。在这两种情况下,哈希值是相同的。
当我执行调用维度中特定值而不是列的查询时,我的散列是不同的:
**Scenario 3:**
SELECT CONVERT(BINARY(20), HASHBYTES('MD5', Concat('Male', CAST(1 as INT))));
Run Code Online (Sandbox Code Playgroud)
输出:'0x048A5F0EE2D2B4070CFF8A38CB6DAC7100000000'
**Scenario 4:**
SELECT CONVERT(BINARY(20), HASHBYTES('MD5', Concat('Male', CAST(1 as NVARCHAR(1)))));
Run Code Online (Sandbox Code Playgroud)
输出:'0x6B216D8BB993AA263265CCF645C282B100000000'
在场景 3 中,我像在场景 1 中一样将 1 转换为 INT。在场景 4 中,我像在场景 2 中一样将 …
insert into Customer(AccountNo,Name,EmailId,MobileNo,[Password],Balance,
CustomerKey,OTPPin,CreatedBy,CreatedOn)
values(@AccountNumber,@Name,@EmailId,
EncryptByPassPhrase(@PassPhrase, CONVERT(nvarchar,@MobileNo)),
HASHBYTES('SHA1',@Password),@TotalBalance,@CustomerKey,@OTPPin,0,GETDATE())
Run Code Online (Sandbox Code Playgroud)
现在,我想要密码的实际值。我怎么才能得到它?