Dzisiaj spotkałem ciekawe zachowanie SQL Server (zaobserwowane w 2005 i 2012 roku), które miałem nadzieję, że ktoś może to wyjaśnić.
Zapytanie dokonujące porównania za =
pomocą pola NVARCHAR zignorowało końcowe miejsce w ciągu (lub automatycznie przycięło wartość przed porównaniem), ale to samo zapytanie z like
operatorem nie zignorowało tego miejsca. Stosowane zestawienie to Latin1_General_CI_AS w 2012 r.
Rozważ to SQL Fiddle: http://sqlfiddle.com/#!6/72262/4
Zauważ, że like
operator nie zwraca wyniku dla ciągu końcowego spacji, ale =
robi to. Dlaczego to?
Punkty bonusowe: Nie jestem w stanie powielić tego na polu VARCHAR, pomyślałbym, że w obu typach danych miejsce będzie obsługiwane w ten sam sposób - czy to prawda?
MyString+'x' = ltrim(rtrim(MyString))+'x'
jak sugerowano na tym bloguOdpowiedzi:
Moja wstępna odpowiedź sugerowała, że flaga ANSI_PADDING ustawiona na OFF może być przyczyną różnicy w zachowaniu. Jest to jednak nieprawidłowe; ta flaga ma wpływ tylko na pamięć, ale nie na porównanie równości.
Różnica wynika z implementacji standardu SQL przez Microsoft . Norma stwierdza, że podczas sprawdzania równości oba łańcuchy po lewej i prawej stronie operatora równości muszą być wypełnione, aby mieć tę samą długość . To wyjaśnia następujące wyniki:
Operator LIKE nie wstawia operandów. Zachowuje się również inaczej dla typów kolumn
VARCHAR
iNVARCHAR
:Zachowanie operatora LIKE dla typu ASCII jest specyficzne dla SQL Server; dla typu Unicode jest zgodny z ANSI.
źródło
SQL narodził się w czasach, gdy większość języków przetwarzania danych używała stałych długości dla każdego pola / zmiennej. Automatyczne uzupełnianie pól tekstowych dodatkowymi spacjami również było częścią tego obrazu. W celu zachowania zgodności z tym zachowaniem oryginalny typ CHAR SQL został jawnie zdefiniowany, aby jego operator „=” ignorował końcowe spacje. (Jeśli uważasz, że to dziwne, pokaż mi przekonujący przypadek, w którym końcowe spacje dołączane do tekstu mają rzeczywiste znaczenie biznesowe ).
Od tego czasu typy SQL CHAR ewoluowały we wszystkich kierunkach, ale nie jest wykluczone, że niektóre bardziej nowoczesne typy danych nadal odziedziczyły pewne cechy charakterystyczne po swoich historycznych poprzednikach.
źródło
W dokumentacji LIKE (Transact-SQL) Microsoft pisze (moje wyróżnienie):
źródło