SQL Server 2014:HASHBYTES为相同的字符串返回不同的值

时间:2015-03-20 15:58:12

标签: sql-server hashbytes

我正在处理每天上传到FTP站点的CSV地址文件。地址记录包括Address_Line1,Address_Line2,City,State,Zip_Code和Country。 CSV中有多个重复的地址。我的任务是将CSV文件中的所有地址与现有地址维度进行比较,然后只加载新地址。为此,我首先从CSV加载到临时表,然后运行以下查询以生成哈希以进行比较:

UPDATE STG_ADDRESS
SET ADDRESS_HASH = HASHBYTES(
    'SHA1'
    ,ISNULL(ADDRESS_LINE1, 'N/A') + 
    ISNULL(ADDRESS_LINE2, 'N/A') +
    ISNULL(CITY, 'N/A') +
    ISNULL(STATE, 'N/A') +
    ISNULL(ZIP_CODE, 'N/A') + 
    ISNULL(COUNTRY, 'N/A'));

这是正常的,有一个例外。 HASHBYTES函数为相同的确切地址生成多个哈希值。对于今天的上传,我运行了以下查询并获得了37个不同的地址:

SELECT DISTINCT 
    ISNULL(ADDRESS_LINE1, 'N/A') 
    + ISNULL(ADDRESS_LINE2, 'N/A')
    + ISNULL(CITY, 'N/A')
    + ISNULL(STATE, 'N/A')
    + ISNULL(ZIP_CODE, 'N/A') 
    + ISNULL(COUNTRY, 'N/A')

FROM STG_ADDRESS

使用Hash更新后,我运行了以下查询并获得了43条记录:

SELECT DISTINCT 
    ISNULL(ADDRESS_LINE1, 'N/A') 
    + ISNULL(ADDRESS_LINE2, 'N/A')
    + ISNULL(CITY, 'N/A')
    + ISNULL(STATE, 'N/A')
    + ISNULL(ZIP_CODE, 'N/A') 
    + ISNULL(COUNTRY, 'N/A')
    ,ADDRESS_HASH

FROM STG_ADDRESS

我用以下查询仔细检查了这个:

SELECT DISTINCT 
    ISNULL(ADDRESS_LINE1, 'N/A') 
    + ISNULL(ADDRESS_LINE2, 'N/A')
    + ISNULL(CITY, 'N/A')
    + ISNULL(STATE, 'N/A')
    + ISNULL(ZIP_CODE, 'N/A') 
    + ISNULL(COUNTRY, 'N/A')
    ,COUNT(ADDRESS_HASH)

FROM STG_ADDRESS

GROUP BY
    ISNULL(ADDRESS_LINE1, 'N/A') 
    + ISNULL(ADDRESS_LINE2, 'N/A')
    + ISNULL(CITY, 'N/A')
    + ISNULL(STATE, 'N/A')
    + ISNULL(ZIP_CODE, 'N/A') 
    + ISNULL(COUNTRY, 'N/A')

HAVING COUNT(ADDRESS_HASH) > 1

并且看到SQL Server在运行SELECT DISTINCT时认为有六个地址相同,但在创建哈希时会以某种方式考虑不同。

是否存在相同字符串可能导致创建不同哈希的任何情况?如果是这样,可以采取哪些措施来纠正这个问题?

1 个答案:

答案 0 :(得分:3)

在调用HASHBYTES之前,应该对空格和大小写进行规范化,因为它始终区分大小写。默认情况下,正常SQL操作期间的字符串比较不区分大小写(您可以使用COLLATION服务器设置对其进行修改)。

LTRIM(RTRIM(TOLOWER(@value)))