与sql server中的LIKE运算符进行比较时,VARCHAR文本不等于Char文本

时间:2012-05-09 08:55:26

标签: sql-server

我有以下代码,它在最后一个语句中为"@B LIKE @A"比较返回false。

我想知道为什么Like会以这种方式表现,因为根据我的知识,基于文本的比较不是基于数据类型。

DECLARE @Var1 Char(20)
DECLARE @Var2 VarChar(20)

SET @Var1 = 'X'
SET @Var2 = 'X'

SELECT 
@Var1 AS A,
@Var2 AS B,
LEN(@Var1) AS 'A Length',
LEN(@Var2) AS 'B Length',
CASE WHEN @Var1 = @Var2 THEN 'Yes' ELSE 'No' END AS 'A = B',
CASE WHEN @Var1 LIKE @Var2 THEN 'Yes' ELSE 'No' END AS 'A LIKE B',
CASE WHEN @Var2 LIKE @Var1 THEN 'Yes' ELSE 'No' END AS 'B LIKE A'

3 个答案:

答案 0 :(得分:2)

CHAR值包含尾随空格,即使您没有看到它们,LEN()也不会报告它们。

尝试此验证:

DECLARE @Var1A Char(40) 
DECLARE @Var2A VarChar(40) 

SELECT @Var1A = @Var1 + 'x', @Var2A = @Var2 + 'x'

SELECT LEN(@Var1A), LEN(@Var2A), '"' + @Var1A + '"', '"' + @Var2A + '"'

21  2   "X                   x                   "  "Xx"

答案 1 :(得分:1)

@A的类型为CHAR(20),因此它的值在右侧用空格填充,以填充为20的长度。

Len()函数排除尾随空格,因此@A和@B都显示长度为1,即使@A已用空格填充。

为了进行比较,SQL Server遵循ansi标准,这些标准要求在比较之前将字符串填充到相同的长度,因此@A和@B显示为相等。

对此的一个例外是LIKE谓词,如果尾部空格在右侧,则不会将字符串填充到相同的长度。

Ref: How SQL Server Compares Strings with Trailing Spaces

答案 2 :(得分:0)

检查出来

DECLARE @Var1 Char(20)
DECLARE @Var2 VarChar(20) 
 SET @Var1 = 'X' 
 SET @Var2 = 'X' 
  SELECT  
  @Var1 AS A,
   @Var2 AS B, 
   LEN(@Var1) AS 'A Length', 
   LEN(@Var2) AS 'B Length', 
   DataLength(@Var1) AS 'A DataLength', 
   DataLength(@Var2) AS 'B DataLength', 
   CASE WHEN @Var1 = @Var2 THEN 'Yes' ELSE 'No' END AS 'A = B', 
   CASE WHEN ltrim(rtrim(@Var1)) LIKE ltrim(rtrim(@Var2)) THEN 'Yes' ELSE 'No' END AS 'A LIKE B', 
   CASE WHEN ltrim(rtrim(@Var2)) LIKE ltrim(rtrim(@Var1)) THEN 'Yes' ELSE 'No' END AS 'B LIKE A'