具有空格的不同计数行为

时间:2013-04-29 19:21:35

标签: sql-server tsql sql-server-2012

请考虑以下事项:

IF OBJECT_ID('tempdb..#CharacterTest') IS NOT NULL
    DROP TABLE #CharacterTest

CREATE TABLE #CharacterTest
(
  [ID] int IDENTITY(1, 1) NOT NULL,
[CharField] varchar(50) NULL 
)


INSERT INTO #CharacterTest (CharField)
VALUES ('DavidIsCool.')
      , ('David')
      , ('Bleh')
      , ('Bleh')
      , ('A')
      , ('A')
      , (' ')
      , ('  ')
      , ('   ')
      , ('    ')
      , ('       ');


Select count(*) RecordCount from  #CharacterTest
SELECT DISTINCT CharField FROM #CharacterTest
SELECT count (DISTINCT CharField) FROM #CharacterTest

对于第二次和第三次查询,我总共返回了5个值。

为什么我的查询表明完全由空格组成的记录是相同的?这是由于整理设置吗?

1 个答案:

答案 0 :(得分:2)

之前从未意识到这一点,但here是你的答案......

  

SQL Server遵循ANSI / ISO SQL-92规范(第8.2节,   ,关于如何比较字符串的一般规则#3)   有空格。 ANSI标准要求填充字符   比较中使用的字符串,以便它们的长度匹配   比较它们。

同样来自同一篇文章,关于我最初的失败假设,这是由于ANSI_PADDING设置:

  

SET ANSI_PADDING设置不会影响SQL Server是否填充   在比较它们之前的字符串。 SET ANSI_PADDING仅影响是否   从插入表中的值中修剪尾随空白,   所以它会影响存储但不会影响比较。