Operator = to T-SQL to nie tyle „równa się”, ile „to to samo słowo / fraza, zgodnie z zestawieniem kontekstu wyrażenia”, a LEN to „liczba znaków w słowie / frazie”. Żadne sortowania nie traktują końcowych spacji jako części poprzedzającego je słowa / frazy (chociaż traktują początkowe spacje jako część ciągu, który poprzedzają).
Jeśli chcesz odróżnić „to” od „tego”, nie powinieneś używać operatora „to to samo słowo lub fraza”, ponieważ „to” i „to” to to samo słowo.
Przyczyną do tego, jak działa = jest idea, że operator równości ciągów powinien zależeć od zawartości swoich argumentów i kontekstu sortowania wyrażenia, ale nie powinien zależeć od typów argumentów, jeśli oba są typami ciągów .
Pojęcie języka naturalnego „to są to samo słowo” zazwyczaj nie jest wystarczająco precyzyjne, aby można je było przechwycić przez operator matematyczny, taki jak =, aw języku naturalnym nie ma pojęcia typu łańcucha. Kontekst (tj. Zestawienie) ma znaczenie (i istnieje w języku naturalnym) i jest częścią opowieści, a dodatkowe właściwości (niektóre wydają się dziwaczne) są częścią definicji =, aby było dobrze zdefiniowane w nienaturalnym świecie dane.
Jeśli chodzi o typ, nie chciałbyś, aby słowa zmieniały się, gdy są przechowywane w różnych typach ciągów. Na przykład wszystkie typy VARCHAR (10), CHAR (10) i CHAR (3) mogą zawierać reprezentacje słowa „kot” i? = „kot” powinno pozwolić nam zdecydować, czy wartość któregokolwiek z tych typów zawiera słowo „kot” (z uwzględnieniem wielkości liter i akcentu określonych przez porównanie).
Odpowiedź na komentarz JohnFx:
Zobacz Używanie danych char i varchar w Books Online. Cytując z tej strony, podkreśl moje:
Każda wartość danych char i varchar ma sortowanie. Sortowania definiują atrybuty, takie jak wzorce bitowe używane do reprezentowania każdego znaku,
reguły porównania i wrażliwość na wielkość liter lub akcentowanie.
Zgadzam się, że mogłoby to być łatwiejsze do znalezienia, ale jest to udokumentowane.
Warto również zauważyć, że semantyka SQL, gdzie = ma związek z rzeczywistymi danymi i kontekstem porównania (w przeciwieństwie do czegoś o bitach przechowywanych na komputerze), była częścią SQL przez długi czas. Założeniem RDBMS i SQL jest wierna reprezentacja rzeczywistych danych, stąd wsparcie dla zestawień na wiele lat przed pojawieniem się podobnych pomysłów (takich jak CultureInfo) do królestwa języków podobnych do Algola. Założeniem tych języków (przynajmniej do niedawna) było rozwiązywanie problemów w inżynierii, a nie zarządzanie danymi biznesowymi. (Ostatnio użycie podobnych języków w aplikacjach niezwiązanych z inżynierią, takich jak wyszukiwanie, ma pewne znaczenie, ale Java, C # itd. Wciąż borykają się z nie-biznesowymi korzeniami).
Moim zdaniem krytykowanie SQL za to, że różni się od „większości języków programowania”, jest niesprawiedliwe. SQL został zaprojektowany do obsługi struktury modelowania danych biznesowych, która jest bardzo różna od inżynierii, więc język jest inny (i lepszy dla jego celu).
Heck, kiedy po raz pierwszy określono SQL, niektóre języki nie miały żadnego wbudowanego typu łańcucha. W niektórych językach operator równości między łańcuchami w ogóle nie porównuje danych znakowych, ale porównuje referencje! Nie zdziwiłbym się, gdyby za następną dekadę lub dwie idea, że == jest zależna od kultury, stanie się normą.