Distinct Count Verhalten mit Blank Spaces

Bitte beachten Sie Folgendes:

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 

Für die zweiten und dritten Abfragen bekomme ich insgesamt 5 Werte zurück.

Warum deuten meine Abfragen darauf hin, dass die Aufzeichnungen, die vollständig aus Räumen bestehen, gleich sind? Ist das aufgrund einer Kollationierung?

Noch nie erkannt, aber hier ist deine Antwort …

SQL server folgt der ANSI / ISO SQL-92 Spezifikation (Abschnitt 8.2, Allgemeine Regeln # 3), wie man Strings mit Leerzeichen vergleicht. Der ANSI-Standard erfordert das Auffüllen für die characterfolgen, die bei Vergleichen verwendet werden, so dass ihre Längen zusammenpassen, bevor sie sie vergleichen.

Auch aus dem gleichen Artikel, in Bezug auf meine anfängliche fehlgeschlagene Annahme, dass dies aufgrund der ANSI_PADDING-Einstellung war:

Die Einstellung SET ANSI_PADDING beeinflusst nicht, ob SQL server-characterfolgen pausiert, bevor sie sie vergleicht. SET ANSI_PADDING wirkt sich nur darauf aus, ob nachlaufende Leerzeichen aus Werten, die in eine Tabelle eingefügt werden, getrimmt werden, so dass es die memoryung betrifft, aber keine Vergleiche.