SQL:比较字符串是否为MD5哈希?

SQL:比较字符串是否为MD5哈希?,sql,sql-server,sql-server-2005,tsql,case-sensitive,Sql,Sql Server,Sql Server 2005,Tsql,Case Sensitive,问题: 我需要比较一个字符串是否是SQL中的MD5哈希 我发现这个PHP函数: function isValidMd5($md5) { return !empty($md5) && preg_match('/^[a-f0-9]{32}$/', $md5); } 由于SQL缺少{32}语法,我只复制了[a-f0-9]32次: IF '200ceb26807d6bf99fd6f4f0d1ca54d4' LIKE '[a-f0-9][a-f0-9][a-f0-9][a-f0-

问题:

我需要比较一个字符串是否是SQL中的MD5哈希

我发现这个PHP函数:

function isValidMd5($md5)
{
    return !empty($md5) && preg_match('/^[a-f0-9]{32}$/', $md5);
}
由于SQL缺少{32}语法,我只复制了[a-f0-9]32次:

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 
然而,为了避免与由32[a-f]组成的用户名发生冲突,不管这种可能性有多大,我希望进行类似的大写比较

但如果出于测试目的,我会:

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 
我得到的是肯定的,不是否定的。 不过,核对拉丁语1_General_CS_AS应该区分大小写。。。 如果区分大小写,a如何使类似的内容区分大小写?

这样行吗

IF myValue LIKE '[a-f0-9][...]' 
and LOWER(myValue) = myValue
这样行吗

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

最好通过检查任何一件会使其失败的事情来反转检查并使维护更简单。这意味着您不必在代码中重复[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

i、 例如,如果它不是32个字符,或者它包含十六进制集之外的字符,那么它将失败

最好通过检查任何一件会使其失败的事情来反转检查并简化维护。这意味着您不必在代码中重复[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

i、 例如,如果它不是32个字符,或者它包含十六进制集之外的字符,那么它将失败

好的,在仔细检查问题之后,这是最好的解决方案:

注意,写ABCDEF而不是A-F很重要,因为在A和F之间的任何字母都不区分大小写

至于A-F:注意小“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 

好的,经过对问题的仔细研究,这是最好的解决方案:

注意,写ABCDEF而不是A-F很重要,因为在A和F之间的任何字母都不区分大小写

至于A-F:注意小“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 

太好了,这是个好主意。我用鞋面代替。但是你错过了COLLATE Latin1\u General\u CS\u,因为在我的价值观之后问题似乎是a-f,如果我用abcdef替换它,那么它工作正常。我认为现在的流行语是:微软的BUG!!!太好了,这是个好主意。我用鞋面代替。但是你错过了COLLATE Latin1\u General\u CS\u,因为在我的价值观之后问题似乎是a-f,如果我用abcdef替换它,那么它工作正常。我认为现在的流行语是:微软的BUG!!!反转,即匹配任何非0-9a-f的字符。例如,它将与“z”匹配。另外,我刚刚编辑了我的答案,因为LIKE模式需要一个小小的调整:它现在被包装在“%”匹配项中。啊,现在我知道了。对不起,是我的错,我没有在if中看到更改的切换。是的,从打字员的角度来看,这更聪明。但是它仍然有区分大小写的问题,这也是本文的重点。不,它没有-我用LOWER使它区分大小写。你为什么不这么认为?我看到您这样说:然而,为了避免与由32[a-f]组成的用户名发生冲突,不管可能性有多大,我想做类似的大写比较,但我不完全确定这是从哪里来的?也许上下文会有帮助…但是Chris,我想区分大小写,这是整篇文章的重点。如果它区分大小写就好了。但是,删除下半部分不会使其区分大小写。反转,即匹配任何非0-9a-f的字符。例如,它将与“z”匹配。另外,我刚刚编辑了我的答案,因为LIKE模式需要一个小小的调整:它现在被包装在“%”匹配项中。啊,现在我知道了。对不起,是我的错,我没有在if中看到更改的切换。是的,从打字员的角度来看,这更聪明。但是它仍然有区分大小写的问题,这也是本文的重点。不,它没有-我用LOWER使它区分大小写。你为什么不这么认为?我看到您这样说:然而,为了避免与由32[a-f]组成的用户名发生冲突,不管可能性有多大,我想做类似的大写比较,但我不完全确定这是从哪里来的?也许上下文会有帮助…但是Chris,我想区分大小写,这是整篇文章的重点。如果它区分大小写就好了。但是,删除小写字母并不会使其区分大小写。您还需要处理NULL。这是真的+1.anyway@zig:如果strinputationthing为NULL,则返回false。你什么意思?对不起。你说得对。我的测试不正确。我测试了您发布的第一个表达式,而不是函数。您还需要处理NULL。这是真的+1.anyway@zig:如果strinputationthing为NULL,则返回false。你什么意思?对不起。你说得对。我的测试不正确。我测试了你发布的第一个表达式,而不是函数。