SQL 有尾随空格字符串的比较与分析

一、先说结论: 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‘–含尾随空格   (完)