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 


此时查询出有结果集