问题:
如果字符串是SQL中的MD5哈希,我需要COMPARE。
我找到了这个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
我得到了,而不是没有。
但是COLLATE Latin1_General_CS_AS应该使它区分大小写......
如何在这个IF中使LIKE区分大小写?
答案 0 :(得分:2)
这会有用吗?
IF myValue LIKE '[a-f0-9][...]'
and LOWER(myValue) = myValue
答案 1 :(得分:2)
最好通过检查任何会使其失败的单一事物来反转检查并使其更易于维护。这意味着您不必在代码中重复[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个字符,或者它包含十六进制集之外的字符,那么它就会失败。
答案 2 :(得分:1)
好的,经过仔细检查后,这是最好的解决方案:
请注意,编写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
并且作为MD5-检查功能:
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