10
06月
2025
在SQLServer数据库的默认配置中,字符串比较是对大小写不敏感的。
比如 数据库中真实存放数据为 TNAME 为 a
但是当执行如下两条语句的时候,都可以查询出该行记录
SELECT * FROM T_USER WHERE 1=1 AND TNAME="A";
SELECT * FROM T_USER WHERE 1=1 AND TNAME="a";
这明显是个错误,查询大写 A 的时候,不该出现该行记录。
解决方案一:
区分大小写需要加入 collate Chinese_PRC_CS_AS:
SELECT * FROM T_USER WHERE 1=1 AND TNAME collate Chinese_PRC_CS_AS="A";
SELECT * FROM T_USER WHERE 1=1 AND TNAME collate Chinese_PRC_CS_AS="a";
但如果此时项目中,很多这种sql语句,且有那种很复杂的连表查询的时候,这种方式显然不太现实。
解决方案二:
新建一个字符比对的函数:
ALTER FUNCTION StrComp(@Str1 VARCHAR(50),@Str2 VARCHAR(50))
--ALTER FUNCTION StrComp(@Str1 VARCHAR(50),@Str2 VARCHAR(50))
RETURNS INTEGER
AS
BEGIN
DECLARE @i INTEGER
--DECLARE @Str1 VARCHAR(50)
--DECLARE @Str2 VARCHAR(50)
DECLARE @y INT
--SET @Str1='a'
--SET @Str2='A'
SET @i=0
--SELECT ASCII(SUBSTRING(@Str1,@i+1,1))
SET @y=1
DECLARE @iLen INT
SET @iLen = LEN(LTRIM(RTRIM(@Str1)))
IF LEN(LTRIM(RTRIM(@Str1))) < LEN(LTRIM(RTRIM(@Str2))) --THEN
SET @iLen = LEN(LTRIM(RTRIM(@Str2)))
WHILE (@i < @iLen)
BEGIN
IF (ASCII(SUBSTRING(@Str1,@i+1,1))=ASCII(SUBSTRING(@Str2,@i+1,1))) --THEN
SET @i = @i +1
ELSE
BEGIN
SET @y=0
BREAK
END
END
RETURN @y
END
调用方式:
SELECT * FROM T_USER WHERE 1=1 AND dbo.StrComp(U.TNAME,“A”) =1
此时查询不出结果集
SELECT * FROM T_USER WHERE 1=1 AND dbo.StrComp(U.TNAME,“a”) =1
此时查询出有结果集