1

현재 Postgres 및 Redshift에서 임의로 생성 된 문자열을 취하여 해시 한 다음 해시의 일부를 사용하여 0-99 사이의 임의의 숫자를 생성하는 함수가 있습니다. Azure SQL 데이터웨어 하우스에서이 기능을 복제하려고하는데 Postgres 및 Redshift에서와 마찬가지로 SQL DW에서 동일한 값을 얻습니다.Azure SQL 데이터웨어 하우스의 문자열로 이진 열 캐스팅

내가 실행중인 문제는 결과를 VARCHAR로 캐스팅하거나 문자열 함수를 사용하면 결과가 다른 문자열입니다. md5 함수의 결과를 동일한 VARCHAR으로 가져오고 싶습니다. 당신이 볼 수 있듯이, 결과 VARCHAR는 MD5 함수의 출력과 크게 다른

SELECT 
    'abc123' as random_string, 
    HASHBYTES('md5', 'abc123') as md5, 
    CAST(HASHBYTES('md5', 'abc123') AS VARCHAR) as md5_varchar, 
    RIGHT(HASHBYTES('md5', 'abc123'), 5) as md5_right 
; 

random_string,md5,md5_varchar 
abc123,0xE99A18C428CB38D5F260853678922E03,éšÄ(Ë8Õò`…6x’.,6x’. 

산출 :

여기에 푸른 SQL DW에서 쿼리이며, 설명하기 . md5의 결과를 동일한 문자열로 변환하는 방법이 있습니까?

Postgres와 Redshift에서 md5 함수의 결과는 VARCHAR이므로 변환 작업이 간단합니다.

-- Redshift 
SELECT 
    'abc123' as random_string, 
    right(strtol(right(md5('abc123'), 3), 16), 2)::INT as tranche 
; 

-- Postgres 
SELECT 
    'abc123' as random_string, 
    right(('x' || lpad(right(md5('abc123'), 3), 4, '0')) :: BIT(16) :: INT :: VARCHAR, 2) :: INT AS tranche 
; 

두 함수의 값이 87을 반환 : 여기

은 적색 편이의 쿼리와 포스트 그레스이다. 이 문제를 해결해야 변환을 사용하여

답변

4

: 당신은 우리가 VARBINARY 값을 변환으로 필요한 스타일에 대한 매개 변수를 정의 할 수 있기 때문에

CONVERT(VARCHAR(32),HashBytes('MD5', 'abc123'),2)

때문이다. 여기에 설명되어 있습니다 : 여기 https://technet.microsoft.com/pl-pl/library/ms187928(v=sql.105).aspx

변환 이진 변환에 대한이 문서에서 설명의 일부입니다

진 스타일 표현 (N) 이진, VARBINARY (N), 문자 (N), 또는 varchar (n), style은 다음 테이블에 표시된 값 중 하나 일 수 있습니다. 표에 나열되지 않은 스타일 값은 오류를 반환합니다.

0 (기본값)

바이너리 바이트 ASCII 문자로 바이너리 바이트 ASCII 문자를 변환합니다. 각 문자 또는 바이트는 1 : 1로 변환됩니다. data_type이 2 진 유형이면 결과의 왼쪽에 에 0x가 추가됩니다.

1 , 2

DATA_TYPE이 바이너리 형식 인 경우는 표현은 문자 표현해야합니다. 표현식은 짝수의 16 진수 (0, 1, 2, 3, 4, 5, 6, 7, 8,9, A, B, C, D, E, F, a, b , c, d, e, f). 스타일이 1 으로 설정된 경우 문자 0x는 표현식의 처음 두 문자 여야합니다. 식에 홀수 문자가 들어 있거나 문자가 인 경우 오류가 발생합니다. 변환 된 표현식의 길이가 data_type의 길이보다 큰 경우 결과는 올바르게 절단됩니다. 인 고정 길이 data_type은 변환 된 결과의 오른쪽에 의 오른쪽에 0이 추가됩니다. data_type이 문자 유형이면 표현식은 이진 표현식이어야합니다. 각 2 진 문자는 두 개의 16 진 문자로 변환됩니다. 변환 된 표현식의 길이가 data_type 길이보다 큰 이면 오른쪽 잘립니다. data_type이 고정 크기 문자 유형이고 변환 된 결과의 길이가 data_type의 길이보다 작은 경우; 공백은 변환 된 표현식의 오른쪽에 이 추가되어 심지어 16 진수를 유지합니다. 문자 0x는 스타일 1의 변환 결과 왼쪽에있는 에 추가됩니다.