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)))
我正在处理每天上传到 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)))