2

请考虑以下几点:

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 个值。

为什么我的查询表明完全由空格组成的记录是相等的?这是由于排序规则设置吗?

4

1 回答 1

2

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

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

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

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

于 2013-04-29T19:36:12.300 回答