VARCHAR vs VARCHAR(X)



结果为'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)VARCHAR

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

Sql Server默认长度未指定的VARCHAR为1。当结合微软对ANSI/ISO SQL-92的解释时(参考这里),结果填充比较字符串在相等比较期间相等长度,导致' '='',因此在第二个测试中非直观的'A'

VARCHAR需要指定大小,如果没有指定大小,则假定声明为一个字符长度。

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

因为,你的if条件是检查"它满足条件。

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

最新更新