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