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

SQL Server 2014: HASHBYTES returning different value for same string

我正在处理每天上传到 FTP 网站的地址 CSV 文件。地址记录由 Address_Line1、Address_Line2、城市、州、Zip_Code 和国家/地区组成。 CSV 中有多个重复地址。我的任务是将 CSV 文件中的所有地址与现有地址维度进行比较,然后仅加载新地址。为此,我首先从 CSV 加载到暂存 table,然后 运行 以下查询生成哈希以进行比较:

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

使用哈希更新后,我运行进行了以下查询并获得了 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 服务器在 运行 一个 SELECT DISTINCT 时认为有六个地址相同,但在创建哈希时却以某种方式认为不同。

是否存在相同字符串可能导致创建不同散列的情况?如果是这样,可以采取什么措施来解决这个问题?

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

LTRIM(RTRIM(TOLOWER(@value)))