VARCHAR与VARCHAR(X)

时间:2014-03-11 18:04:33

标签: sql sql-server

这导致'B':

DECLARE @NAME VARCHAR(20)=' s'
IF (@NAME IS NULL OR @NAME='')
   SELECT 'A'
ELSE
   SELECT 'B'

然而,这导致'A'。

DECLARE @NAME VARCHAR=' s'
IF (@NAME IS NULL OR @NAME='')
   SELECT 'A'
ELSE
   SELECT 'B'

唯一的区别是VARCHAR(20) vs VARCHAR

这种奇怪行为的原因是什么?

2 个答案:

答案 0 :(得分:4)

Sql Server将未指定长度的VARCHAR默认为length of 1。如果在conjunction with Microsoft's interpretation of ANSI/ISO SQL-92 (ref here)中使用,则会导致填充在相等比较期间将字符串比较为相等的长度,从而导致' '='',因此非 - 第二次测试中的直觉'A'

答案 1 :(得分:0)

当没有指定大小时,VARCHAR需要指定一个大小,它假定声明的长度为一个字符。

要确认这一点,您可以检查变量的长度。

因为,您的if条件是检查'''它满足了条件。

DECLARE @NAME VARCHAR=' s'
select datalength(@name)

returns 1 

DECLARE @NAME VARCHAR(20)=' s'
select datalength(@name)

returns 2