一、先说结论: 1、
尾随空格不影响字符串的对比查询结果。 2、
字符串的LEN(字符数(不含尾随空格))与DATALENGTH(字节数)可能不一样,需要根据实际业务场景选择使用。
二、问题描述: 一个字符串在与它后面加空格(尾随空格)的字符串,对比是否相等时,结果为什么是相等呢?
三、验证与分析: 先来看下面的SQL DECLARE @strA VARCHAR(10) = ‘maco ‘; –后面多几个尾随空格 DECLARE @strB VARCHAR(10) = ‘maco‘; –1、判断 @strA = @strB IF (@strA = @strB) SELECT @strA , @strB,‘@strA与@strB相等‘; ELSE SELECT @strA , @strB, ‘@strA与@strB不相等‘; –运行结果 @strA与@strB相等 –2、判断 @strA =@strB and len(@strA)= len(@strB) IF (@strA = @strB AND LEN(@strA) = LEN(@strB)) SELECT LEN(@strA) , LEN(@strB) , ‘@strA与@strB相等‘; ELSE SELECT LEN(@strA) , LEN(@strB) , ‘@strA与@strB不相等‘; –运行结果 @strA与@strB相等 –3、判断 @strA =@strB and datalength(@strA)= datalength(@strB) –判断两个字符串是否完全相等:在判断字符串内容是否一样的同时,用datalength比较字符串的字节数是否相等; IF (@strA = @strB AND DATALENGTH(@strA) = DATALENGTH(@strB)) SELECT DATALENGTH(@strA) , DATALENGTH(@strB), ‘@strA与@strB相等‘; ELSE SELECT DATALENGTH(@strA) , DATALENGTH(@strB), ‘@strA与@strB不相等‘; –运行结果 @strA与@strB不相等 –查看SQL Server的联机丛书发现: —
LEN()返回给定字符串表达式的字符数(不包含尾随空格),而不是返回字节数。DATALENGTH返回字节数。 –4、查看@str, LEN(), DATALENGTH()进行对比和验证如下: SELECT @strA, LEN(@strA) [LEN字符数(不包含尾随空格)], DATALENGTH(@strA) DATALENGTH字节数 SELECT @strB, LEN(@strB) [LEN字符数(不包含尾随空格)], DATALENGTH(@strB) DATALENGTH字节数
因此我们也可以推出结论:尾随空格不影响字符串的对比查询结果。 如下SQL语句,均能查出SENO = ‘10000922031‘数据 SELECT TOP 10 * FROM [dbo].[BIGTABLE] WHERE SENO = ‘10000922031‘ SELECT TOP 10 * FROM [dbo].[BIGTABLE] WHERE SENO = ‘10000922031 ‘–含尾随空格
但以下SQL语句不能查出对应的数据(前置空格) SELECT TOP 10 * FROM [dbo].[BIGTABLE] WHERE SENO = ‘ 10000922031‘–含尾随空格 (完)