2012-02-21 2 views
2

질문 :SQL : 문자열이 MD5 해시인지 비교해보십시오.

SQL에서 문자열이 MD5 해시 인 경우 COMPARE해야합니다.

I이 PHP 함수 발견

:로

IF '200ceb26807d6bf99fd6f4f0d1ca54d4' LIKE '[a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9][a-f0-9]' 
BEGIN 
    PRINT 'YES' 
END 
ELSE 
BEGIN 
    PRINT 'NO' 
END 

그러나 : SQL은 {32} 문법 부족 때문에

function isValidMd5($md5) 
{ 
    return !empty($md5) && preg_match('/^[a-f0-9]{32}$/', $md5); 
} 

, I는 단지 복제 [A-f0-9] 32 회 32 [af]로 구성된 사용자 이름과 가능한 충돌을 피하십시오. 그러나 나는 대문자와 같은 비교를하고 싶습니다.

그러나 테스트를 위해 내가 할 경우 :

IF 'E' COLLATE Latin1_General_CS_AS LIKE ('[a-f0-9]' COLLATE Latin1_General_CS_AS) 
BEGIN 
    PRINT 'yes' 
END 
ELSE 
BEGIN 
    PRINT 'no' 
END 

내가 네 얻을, 그리고 더.
그러나 COLLATE Latin1_General_CS_AS는 대소 문자를 구분해야합니다 ...

이 IF에서 LIKE를 어떻게 만들 수 있습니까?

답변

3

수표를 거꾸로하고 실패하게 만드는 단 한 가지 항목을 확인하여 유지 관리하는 것이 좋습니다. 즉, 코드에서 [0-9a-f] 번을 32 번 반복하지 않아도됩니다.

IF LEN(@myValue) <> 32 OR LOWER(@myValue) LIKE '%[^0-9a-f]%' 
BEGIN 
    -- No it isn't 
END ELSE BEGIN 
    -- Yes it is 
END 

즉, 32 문자가 아니거나 16 진수 세트 외부에 문자가 포함되어 있으면 오류가 발생합니다. 이 A와 F 사이에 다른 어떤 문자가 대소 문자를 구분하지 않기 때문에, ABCDEF 대신 A-F의 작성 중요하다는 것을

참고 :

+0

^의 의미는 무엇입니까? 이것은 내 SQL 서버에서 작동하지 않기 때문에 ... –

+0

반전 (즉, * 0-9a-f가 아닌 모든 문자와 일치). 예를 들어 'z'와 일치합니다. 또한 LIKE 패턴은 약간의 조정이 필요 했으므로 이제 막 답변을 편집했습니다. 이제 '%'일치로 묶었습니다. –

+0

아, 이제 알겠습니다. 죄송합니다, 내 잘못, 나는 if에서 변경된 스위칭을 보지 못했습니다. 그렇습니다. 타이피스트 관점에서 볼 때, 더 똑똑합니다. 하지만 여전히이 게시물의 핵심은 대소 문자를 구분하는 문제가 있습니다. –

2

이 방법이 유용할까요?

IF myValue LIKE '[a-f0-9][...]' 
and LOWER(myValue) = myValue 
+0

위대한,이 작품 (아이디어 현명). 대신에 어퍼를 사용합니다. 하지만 myValue 후 Latin1_General_CS_AS COLLATE 그리워 –

+1

문제는 abcdef로 바꾸면 a-f 인 것처럼 보입니다. 그렇다면 제대로 작동합니다. 나는 그날의 말을 다음과 같이 생각한다 : 마이크로 소프트의 버그 !!! –

1

확인, 문제의 근면 한 심사 후, 이것은 최선의 솔루션입니다.

(AF에 관해서 :주의 그 작은 'A'테두리의 경우는 거의 'B'와 달리,이 범위에없는대로입니다.)

DECLARE @myValue varchar(100) 

--SET @myValue = '66B9E31D4C59D3802279515F9B1A6222' 
SET @myValue = '66B9E31D4C59D3802279515F9B1B6222' 


IF LEN(@myValue) <> 32 OR @myValue LIKE '%[^0-9ABCDEF]%' COLLATE Latin1_General_CS_AS 
BEGIN 
    print 'No it isn''t' 
END ELSE BEGIN 
    print 'Yes it is ' 
END 

그리고 MD5-Checkfunction 같은 :

IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fn_IsMd5Hash]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT')) 
DROP FUNCTION [dbo].[fn_IsMd5Hash] 
GO 




-- ======================================================================== 
-- Author: 
-- Create date: 26.04.2012 
-- Last modified: 26.04.2012 
-- Description: Überprüfen ob string ein MD5-Hash ist 
-- ======================================================================== 

-- PRE: varchar(50) 
-- POST: True/False 
-- PRINT dbo.[fn_IsMd5Hash]('66B9E31D4C59D3802279515F9B1B6222') 
CREATE FUNCTION [dbo].fn_IsMd5Hash(@strInputAnything varchar(50)) 
    RETURNS bit 
AS 
BEGIN 
    DECLARE @bIsMd5Hash AS bit 

    SET @bIsMd5Hash = 'false' 

    IF LEN(@strInputAnything) = 32 AND NOT @strInputAnything LIKE '%[^0-9ABCDEF]%' COLLATE Latin1_General_CS_AS 
     SET @bIsMd5Hash = 'true' 

    RETURN @bIsMd5Hash 
END 


GO 
+0

'NULL'도 처리해야합니다. 그것은 사실을 반환합니다. (어쨌든 +1) – zig

+0

@zig : strInputAnything이 NULL이면 false를 반환합니다. 무슨 소리 야? –

+0

죄송합니다. 당신이 올바른지. 내 테스트가 잘못되었습니다. 내가 게시 한 첫 번째 표현을 테스트했지만 함수는 테스트하지 않았습니다. – zig

관련 문제