Оператор = означает, что T-SQL не столько «равно», сколько «это одно и то же слово / фраза в соответствии с сопоставлением контекста выражения», а LEN - это «количество символов в слове / фразе». Никакие параметры сортировки не рассматривают завершающие пробелы как часть предшествующего им слова / фразы (хотя они рассматривают начальные пробелы как часть предшествующей им строки).
Если вам нужно отличить «это» от «это», не следует использовать оператор «это одно и то же слово или фраза», потому что «это» и «это» - одно и то же слово.
Способствовать = works является идея о том, что оператор равенства строк должен зависеть от содержимого своих аргументов и от контекста сопоставления выражения, но он не должен зависеть от типов аргументов, если они оба являются строковыми типами. .
Концепция естественного языка «это одно и то же слово» обычно недостаточно точна, чтобы ее можно было уловить математическим оператором, таким как =, и в естественном языке нет концепции строкового типа. Контекст (то есть сопоставление) имеет значение (и существует на естественном языке) и является частью истории, а дополнительные свойства (некоторые, которые кажутся причудливыми) являются частью определения =, чтобы сделать его четко определенным в неестественном мире данные.
Что касается типа, вы не хотите, чтобы слова менялись, когда они хранятся в строках разных типов. Например, типы VARCHAR (10), CHAR (10) и CHAR (3) могут содержать представления слова «кошка» и? = 'cat' должно позволить нам решить, содержит ли значение любого из этих типов слово 'cat' (с проблемами регистра и акцента, определяемыми сопоставлением).
Ответ на комментарий JohnFx:
См. Раздел Использование данных char и varchar в электронной документации. Цитата с этой страницы, акцент мой:
Каждое значение данных char и varchar имеет сопоставление. Сопоставления определяют такие атрибуты, как битовые шаблоны, используемые для представления каждого символа,
правила сравнения и чувствительность к регистру или акцентированию.
Я согласен, что это было бы проще найти, но это задокументировано.
Стоит также отметить, что семантика SQL, где = имеет отношение к реальным данным и контексту сравнения (в отличие от чего-то, что связано с битами, хранящимися на компьютере), долгое время была частью SQL. Предпосылкой для СУБД и SQL является точное представление реальных данных, поэтому они поддерживают сопоставления за много лет до того, как аналогичные идеи (такие как CultureInfo) вошли в сферу алголо-подобных языков. Предпосылкой этих языков (по крайней мере, до недавнего времени) было решение инженерных проблем, а не управление бизнес-данными. (В последнее время использование подобных языков в не инженерных приложениях, таких как поиск, набирает обороты, но Java, C # и т. Д. Все еще борются со своими некоммерческими корнями.)
На мой взгляд, несправедливо критиковать SQL за то, что он отличается от «большинства языков программирования». SQL был разработан для поддержки структуры моделирования бизнес-данных, которая сильно отличается от инженерной, поэтому язык другой (и лучше для его цели).
Черт возьми, когда SQL был впервые указан, некоторые языки не имели встроенного строкового типа. И в некоторых языках по-прежнему оператор равенства между строками вообще не сравнивает символьные данные, а сравнивает ссылки! Меня не удивит, если через десять-два десятилетия идея, что == зависит от культуры, станет нормой.